单链表上的基本运算
1.建立单链表
假设线性表中结点的数据类型是字符,我们诸葛输入这些字符的结点,并以“$”作为输入结束标志符。动态建立单链表的常用方法有如下两种:
1)头插法建表
算法描述:从一个空表开始,重复读入数据,生成新结点,将读入数据存放到新结点的数据域中,然后将进阶点插入到当前链表的表头结点之后,直至读入结束标志为止。建表过程如图2.9所示。
用头插法建立单链表的算法:
Linklist CreateFromHead() { LinkList L; Node *s; char c; int flag=1; /*设置一个标志变量flag,初值为1,当输入“$”时,将flag置为0,建表结束*/ L=(Linklist)malloc(sizeof(Node));/*为头结点分配存储空间*/ L->next=NULL; while(flag) { c=getchar(); if(c!='$') { s=(Node *)malloc(sizeof(Node));/*为读入的字符分配存储空间*/ s->data=c; s->next=L->next; L->next=s; } else flag=0; } return L; } 算法 用头插法建立单链表 |
头插法的到的单链表的逻辑顺序与输入的顺序相反,所以也称头插法建表为逆序建表法。
2)尾插法建表
头插法建立链表虽然算法简单,单身成的链表中结点的次序和输入的顺序相反。若希望二者次序一致,可采用尾插法建表。该方法是将新结点插到当前链表的表尾上。为此需增加一个尾指针r,使之始终指向当前链表的表尾。如图2.10所示。
该算法的实现与头插法建表的不同之处在于指针的变化,其具体实现如下:
Linklist CreateFromTail() {/*将新增的字符追加到链表的末尾*/ LinkList L; Node *rk*s; int flag=1; /*设置一个标志变量flag,初值为1,当输入“$”时,flag置为0,建表结束*/ L=(Node *)malloc(sizeof(Node));/*为头结点分配存储空间*/ L->next=NULL; r=L;/*r指针始终动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/ while(flag) { c=getchar(); if(c!='$') { s=(Node *)malloc(sizeof(Node)); s->data=c; s->next=s; r=s; } else { flag=0; r->next=NULL;/*将最后一个结点的next链域置为空,表示链表的结束*/ } } return L; } 算法 尾插法建表 |