#include<stdio.h>
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
LinkeList CreatList1(LinkList &L) //头插法建立单链表
{
LNode *s;
int x;
L = (LinkList *)malloc(sizeof(LNode)); //动态分配内存空间
L->next = NULL; //头节点指向空
scanf("%d",&x);
while(x!=9999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
LinkList *CreatList2(LinkList &L) //尾插法建立单链表
{
LNode *s;
LNode *r = L;
int x;
L = (LinkList *)malloc(sizeof(LNode));
scanf("%d", &x);
while(x!=9999)
{
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s; //在r结点的后面插入
r = s; //r指向s节点
scanf("%d", &x);
}
r->next = NULL; //最后的节点一定要指向NULL
return L;
}
LNode *GetElem(LinkList L, int i) //按序号i查找元素
{
int j = 1;
LNode *p = L->next; //初始化指针p为头指针
if(i==0)
{
return L; //返回头节点
}
else if(i<1)
{
return NULL; //情况不存在
}
while(p&&j<i)
{
p = p->next; //指针p向后指向
j++; //计数器j往后移一位
}
return p; //返回当前节点
}
LNode *LocateElem(LinkList L, ElemType e) //按值查找节点
{
LNode *p = L->next;
while(p != NULL && p->data != e)
{
p = p->next; //链表往后移动查找
}
return p;
}
LNode *CountLength(LinkList L,int x) //求单链表的长度
{
LNode *p = L->next;
int i=0;
while(1)
{
p->next = p;
i++;
}
return i;
}
void main()
{
LinkList *p,*q,*s; //s是待插节点,再定义一个临时节点p
/****前插法插入节点****/
p = GetElem(L,i-1); //找到i-1位置的节点 p (待插节点的前驱结点)
s->next = p->next; // 将p的原指向转给s
p->next = s; //p指向s,即s在p节点(i-1)位置的后面 i的位置
/****后插法插入节点****/
p = GetElem(L,i); //找到i位置的节点 p (待插节点的位置)
s->next = p->next; //交换指向 ,s节点就到了p节点(i位置)的后面i+1的位置
p->next = s;
int temp; //用临时变量交换data值
temp = p->data; //实现i和i+1位置节点值的交换
p->data = s->data;
s->data = temp;
/****删除节点的操作****/
p = GetElem(L,i-1); //查找目标位置之前的节点p
q = p->next; //q是目标删除节点 ,在p节点后面
p->next = q->next; //断开链接 ,将q原指向直接由p节点指向
free(q); //释放节点的存储空间
/****删除节点的骚操作****/
p = GetElem(L,i-1);
q = p->next; //q指向*p节点的后继(i位置)
p->data = q->next->data;//将p的数据域和q节点的后继元素(i+1)的数据域交换
p->next = q->next; //指针q的指向交给了p的指向,实现了断链
free(q);
}