一、单链表:data-next
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
1.头插法建立链表:
LinkList CreatList1(LinkList &L)
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//初始化为空表
scanf("%d",&x);
while(x!=999)//999表示结束
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
2.尾插法建立链表
LinkList CreatList1(LinkList &L)
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *r=L;//r表示尾指针
L->next=NULL;//初始化为空表
scanf("%d",&x);
while(x!=999)//999表示结束
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;//新插入的置为尾指针
scanf("%d",&x);
}
r->next==NULL;
return L;
}
3.插入操作:(p->next=q)
LNode *GetElem(LinkList L,i)//查找
{
int j=1;
LNode *p=L->next;//头结点指针赋给p
if(i==0) return L;
if(i<1) return NULL;
while(p&&j<i)
{
p=p->next;
j++;
}
return p;//返回第i个节点的指针
}
(1)后插入,在p后面插入s(插入到链表的第i个位置)
1>p=GetElme(L,i-1);
2>s->next=p->next;
3>p->next=s;
(2)前插入,在p后面插入s(插入到链表的第i-1个位置)
1>p=GetElme(L,i-1);
2>s->next=p->next;
3>p->next=s;
4>j=p->data;
5>p->data=s->data;
6>s->data=j;
4.删除第i个节点:
p=GetElme(L,i-1);
q=p->next;//q是被删除的节点
p->next=q->next;
free(q);
二.双链表
ElemType data;
struct DNode *prior,*next;
}DNode,*LinkList;
1.(1)插入(在p和q之间插入s)
s->next=p->next;
s->prior=p;
p->next->prior=s;
p->next=s;
(2)删除
p->next=s->next;
q->prior=s->prior;
free(s);
2.循环链表:没有指针为NULL的链表,无需判断表尾。