要使用链表,就要先创建一个链表,这里介绍头插法创建链表。假如我们现在要在链表中插入一些数据:1、2、3、4、5,并从键盘输入这些数据,
最后数据存入到链表中是反过来的,即{5,4,3,2,1},因为头插法每次都是在头部插入数据的,先插入1,此时表中数据为{1};接着在头部插入2,
此时表中数据数据为{2,1};再在头部插入3,此时表中数据数据为{3,2,1};以此类推,最后,表中数据的顺序和你输入的顺序是相反的。而头插法创建链表又分为两种情况。一种是已知节点个数,
还有一种是未知节点个数。下面用代码来展示一下
先说一下未知结点个数的情况,即不确定输入的结点个数,看代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct LNode 4 { 5 int data; 6 struct LNode *next; 7 }LNode,*LinkList; 8 9 LinkList create_LinkList() 10 { 11 LinkList head; //声明头指针 12 int e; 13 int flag=-1; //用-1作为输入结束标志 14 LNode * p=NULL; 15 head=(LinkList)malloc(sizeof(LNode)); //头插法创建链表需要创建表头 16 head->next=NULL; 17 scanf("%d",&e); 18 while(e!=flag) 19 { 20 p=(LinkList)malloc(sizeof(LNode)); 21 p->data=e; 22 p->next=head->next; 23 head->next=p; 24 p=p->next; 25 scanf("%d",&e); 26 } 27 return head; 28 } 29 int main() 30 { 31 LinkList p; 32 p=create_LinkList(); 33 p=p->next; 34 while(p!=NULL) 35 { 36 printf("%d ",p->data); 37 p=p->next ; 38 } 39 printf("\n"); 40 return 0; 41 }
结果如下:
还有在已知结点个数的情况下,用代码展示一下
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define N 10 //结点个数 4 typedef struct LNode 5 { 6 int data; 7 struct LNode *next; 8 }LNode,*LinkList; 9 10 LinkList create_LinkList(int n) 11 { 12 LinkList head; //声明头指针 13 LNode * p=NULL; 14 head=(LinkList)malloc(sizeof(LNode)); //需要创建表头结点 15 head->next=NULL; 16 for(int i=1;i<=N;i++) 17 { 18 p=(LinkList)malloc(sizeof(LNode)); 19 scanf("%d",&p->data); 20 p->next=head->next; 21 head->next=p; 22 p=p->next; 23 } 24 return head; 25 } 26 int main() 27 { 28 LinkList p; 29 p=create_LinkList(N); 30 p=p->next; 31 while(p!=NULL) 32 { 33 printf("%d ",p->data); 34 p=p->next ; 35 } 36 printf("\n"); 37 return 0; 38 }
结果如下:
通过观察两次的结果,可以看出用头插法创建链表时都会产生这种情况:即插入的数据与插入的顺序相反。
原文:https://www.cnblogs.com/buanxu/p/12795278.html