一.带头结点的单链表的建立-尾插法
- 初始化一个单链表。
再复习一下初始化一个单链表:
//初始化一个带头结点的单链表
typeset struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
bool InitList(LinkList &L){
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL)
return false;
L—>next=NULL;
return true;
}
void main(){
LinkList L;
InitList(L);
//。。。。
」
- 依次取得数据元素插入到表尾。
设置一个表尾指针,每次执行后插操作。
LinkList List_TailInsert(LinkList &L){ //尾插法建立单链表
int e;
LNode *s,*r; //r是尾指针
L=(LinkList)malloc(sizeof(LNode)); //建立头结点
L->next=NULL; //初始化为空链表
r=L; //尾指针先指向头结点
scanf(“%d”,&e);
while(e!=996){ //输入结束的标识,当输入996时单链表建立完成(不包括996元素)
s=(LNode*)malloc(sizeof(LNode));//分配结点
s->data=e;
r->next=s;
r=s; //尾指针指向当前结点(也是最后一个结点)
scanf(“%d”,&e);
}
r->next=NULL; //尾指针指向空
return L; //返回这个建立好的单链表
}
二.带头结点的单链表的建立-头插法
核心思想就是每次对头结点执行后插操作。
LinkList List_HeadInsert(LinkList &L){
int e;
LNode *s;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL; //此句必须加!否则头指针指向未知区域,影响尾结点指向
scanf(“%d”,&e);
while(e!=996){
s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=L->next;
L->next=s;
scanf(“%d”,&e);
}
return L;
}
头插法是在头结点后面依次插入,所以遍历结点时输出为逆序。在后面单链表的逆置也是运用此思想。
总结一下:尾插法注意设置尾指针,头插法的运用是单链表的逆置。两种方法的核心都是给定结点的后插操作。