/************************************************************************/ /* 本程序实现含有头结点的单链表的建立和数据域元素的输出 2012年7月8日0:14:05 */ /************************************************************************/ #include < stdio.h > #include < malloc.h > typedef int ElemType ; typedef struct LNode // 线性表的单链表存储结构 { ElemType data; struct LNode *next; } LNode,*Pnode; // 这样以后LNode 相当于struct LNode Pnode 它表示的是结构体的数据类型。Pnode 相当于struct LNode * /*线性表创建函数*/ Pnode creat_linklist(void) { int i; //循环的计数参数 int tem; // 暂时存储用户输入节点的数据域的值 int len; //创建线性表的长度 Pnode phead,pnew,ptail;// 定义三个节点 phead 表示头结点,pnew 表示新生成的节点,ptail表示尾节点。 phead = (Pnode)malloc(sizeof(LNode));// 为头结点分配一段内存 ptail = phead;// 让头节点指向尾节点,利用尾插法建立链表。 ptail ->next = NULL;//尾节点后继指向空 printf("请输入需要生成单链表节点的个数:len = "); scanf("%d",&len); for (i = 0;i < len; i++ ) { printf("请输入单链表的第%d个节点的值:",i+1); scanf("%d",&tem); pnew = (Pnode)malloc(sizeof(LNode));//生成一个新节点 pnew->data = tem;//将用户输入的值赋给新节点的数据域 ptail->next = pnew ;//尾插法的实现 pnew->next=NULL; ptail = pnew; } return phead; } /* 线性表遍历输出*/
void traverse_linklist (Pnode phead) { Pnode p = phead->next; while (NULL != p) { printf(" %d ", p->data); p = p->next; } return; } int main(void) { Pnode phead = NULL; phead = creat_linklist(); traverse_linklist(phead); return 0; }
这里解释一下什么是尾插法。首先分配三个节点,头结点Phead,尾节点Ptail,以及新生成节点Pnew.首先给头结点和尾节点分配内存,然后让头节点和尾节点相等。
在新节点生成之后另Ptail的后继继节点尾Pnew,语句为Ptail->next= Pnew: 然后把Pnew后继指向空节点 Pnew->=NULL; 然后另Ptail=Pnew;
这样就把Pnew 挂在了Phead 的后面。
这以后每次循环之后 Ptail 总是指向链表的尾部
所以这种发法叫做尾插法