一.带头节点的单链表。
带头结点非空单链表
线性表的单链表的存储结构描述:
typedef struct{
ElemType data;//数据域
struct LNode*next;//指针域。
}LNode,*LinkList;
头指针为空,L=NULL(不带头结点的单链表为空)。
L->next=NULL;(带头结点的空单链表L)。
p结点的数据域值:p->data;
p结点的后继结点:p->next;
插入操作。
单链表插入操作的主要步骤:
1.确定插入位置(找到插入位置的前驱结点).
2.产生待插入的新结点。
3.修改链指针,使新结点链如单链表的指定位置。
ListInsert_L(&L,i,e)的实现。
操作要求:在带头结点的单链表L中第i个元素ai之插入元素值为e的结点。其中1<=i<=n+1;
1.找到第i个结点的前驱结点(即第i-1个结点)
p=L;j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
2.产生数据域值为e的新结点s.
在s=(LinkList)malloc(sizeof(LNode));
s->data=e;
3.修改链指针.
S->next=p->next;
p->next=s;
实现算法;
status ListInsert_L(LinkList&L,int i,ElemType e){
p=L;
j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1)return ERROR;
s=(LinkList)malloc(sizeof(LNode));
if(s==NULL) return OVERFLOW;
s->data=e;
s->next=p->next;
p->next=s;
return ok;
}
删除操作
删除操作ListDelete_L(&L,I,&e)
操作要求:删除带结点的单链表L中的第i个元素,并用e返回值,1<=i<=n)
1.找到第i个结点的前驱结点(即第i-1个结点)
p=L;j=0;
while(p->next&&j<i-1){
p=p->next;
++j;
}
2.修改链指针(使待删结点从链中脱离)
q=p->next;
p-next=q->next;
e=q->data;
3.释放空间
free(q);
实现算法:
status ListDelete_L(Linklist&L,int i,ElemType&e){
p=L;
j=0;
while(p->next&&j<i-1){
p=p->next;
j++;
}
if(!(p->next)||j>i-1) return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return ok;
}
二.不带头结点的单链表;
插入操作:
操作要求:在不带头结点的单链表中第1个结点之前插入新元素e.
status ListInsert_LN(LinkList&L,ElemType e){
s=(LinkList)malloc(sizeof(LNode));
if(s==NULL) return OVERFLOW;
s->data=e;
s->next=L;
L=s;
}
删除操作
操作要求:在不带头结点的单链表中删除第1个元素。
status ListDelete_LN(LinkList&L,ElemType&e){
if(L==NUll) return ERROR;
else{
q=L
L=q->next;
e=q-data;
free(q);
return ok;
}
}