单链表
1、结构
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode, *LinkList;
2、头插法建立链表
LinkList List_HeadInsert(LinkList &L){
LNode *s,; int x;
L=(LinkList)malloc(sizeof(LNode)); //创建头结点
L->next=NULL; //初始为空链表
scanf("%d",&x); //输入结点的值
while(x!=9999){ //输入9999则结束
s=(LNode*)malloc(sizeof(LNode)); //创建新结点
s->data=x;
s->data=L->next;
L->next=s; //将新结点插入表中,L为头指针
scanf("%d),&x);
}
return L;
}
3、尾插法建立链表
LinkList List_TailInsert(LinkList &L){
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L; //r为表尾指针
scanf("%d",&x); //输入结点的值
while(x!=9999){ //输入9999则结束
s=(LNode*)malloc(sizeof(LNode)); //创建新结点
s->data=x;
r->next=s;
r=s; //r指向新的表尾指针
scanf("%d",&x);
}
r->next=NULL; //表尾指针置空
return L;
}
4、插入节点
p=GetElem(L,i-1); //查找插入位置的前驱结点
s->next=p->next;
p->next=s;
5、删除节点
p=GetElem(L,i-1); //查找删除位置的前驱结点
q=p->next; //令q指向被删除的结点
p->next=q->next; //将*q结点从链表中“断开”
free(q); //释放
6、单链表就地逆置,空间复杂度O(1)
//头插的原理
LinkList Reverse(LinkList L){
LNode *p , *r; //p为工作指针,r为p的后继,以防断链
p=L->next; //从第一个元素结点开始
L->next=NULL; //先将头结点L的next域置为NULL
while(p!=NULL){ //依次将元素结点摘下
r=p->next; //暂存p的后继
p->next=L->next; //将p的结点插入到头结点之后
L->next=p;
p=r;
}
return L;
}
双链表
1、结构
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinkList;
2、插入
//将*s结点插入到*p结点之后
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
3、删除
//删除结点*p的后继结点*q
p->next=q->next;
q->next->prior=p;
free(q);