单链表是线性表中链式存储中较为简单的一种数据存储方式,通常要根据不同情况的需要灵活运用两种建立方式。
先定义结点:
typedef struct Lnode {
int date;
struct Lnode *next;
}LNode;
假设:线性表中元素的数据类型是整型,以32767作为元素输入的结束标志。
【头插入法】
从一个空表开始,重复读入数据,生成新结点,读入数据存放到新结点的数据域中,然后将新结点插入到当前链表的第一个位置,直到读入结束标志为止。即每次插入的结点都作为链表的第一个结点(当然除头结点外)。
LNode *create_LinkList(void)
/* 头插入法创建单链表,链表的头结点head作为返回值 */
{
int data ;
LNode *head, *p; /* p指向当前结点 */
head= (LNode *) malloc( sizeof(LNode));
head->next=NULL; /* 创建链表的表头结点head */
while (1)
{ scanf(“%d”, &data) ;
if (data==32767) break ;
p= (LNode *)malloc(sizeof(LNode));
p–>data=data; /* 数据域赋值 */
p–>next=head–>next ; head–>next=p ;
/* 钩链(先右后左),新创建的结点总是作为第一个结点 */
}
return head;
}
就是上面的插入方式,先让P指向待插入结点的地址域的指针指向头结点后的结点,再让头结点地址域指针指向待插入结点。
【 尾插入法】
头插入法建立链表虽然算法简单,但生成的链表中元素的次序和输入的次序相反。若希望二者次序一致,可采用尾插法建表。该方法是将新结点插入到当前链表的表尾,使其成为当前链表的尾结点。
LNode *create_LinkList(void)
/* 尾插入法创建单链表,链表的头结点head作为返回值 */
{
int data ;
LNode *head, *rear, *p;
head=rear=(LNode *)malloc(sizeof(LNode));
head->next=NULL; /* 创建单链表的表头结点head */
while (1)
{ scanf(“%d”,& data);
if (data==32767) break ;
p= (LNode *)malloc(sizeof(LNode));
p–>data=data; /* 数据域赋值 */
p–>next=rear–>next; rear–>next=p; rear=p;
/*钩链(先右后左),新创建的结点总是作为最后一个结点*/
}
return head;
}
rear尾指针始终指向最后一个结点。插入流程为,把尾指针指向结点的地址域的空值赋值给待插入结点的地址域,再把最后一个结点的地址域的指针指向待插入结点,再把p即新的最后一位结点的位置给rear即可。