c语言链表初学

由于编译原理篇幅太大,本人又生性愚钝所以这个坑没有一年我估计都填不上。但是中间应该纪录一些补充的基础知识内容

C链表篇

要写语言首先要会数据结构,而链表是节省内存的必修内容

链表的用处这里就不多做赘述百度百科多有,问题是怎么理解链表呢?网上有很多代码却没有合理的图文描写现在我先贴一段代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include “stdlib.h”
#include “stdio.h”
#define NULL ((void *)0)
#define LEN sizeof(struct student)
struct student
{
int num;
int score;
struct student *next;
};
int n;
//建立链表
struct student *creat(void)
{
struct student *head;
struct student *p1,*p2; //建立一个*head指针与来做链表的头部
n=0;
p1=p2=(struct student *)malloc(LEN);//开辟p1p2空间
scanf(%d,%d”,&p1->num,&p1->score);
head=NULL;
while(p1->num != 0)//只要num的输入不是为0时一直循环
{
n=n+1;
if(n == 1) //由于一开始n=0所以现在n=1第一回时必进条件语句
head = p1; //head指针的位置给开辟好的p1空间
else
p2->next = p1; //第一次循环后p2指向p1
p2 = p1;
p1 = (struct student *)malloc(LEN);//p1指向新开辟的空间
scanf(%d,%d”,&p1->num,&p1->score);
}
p2->next = NULL;//结束链表
return(head);
}
void main()
{
creat();
};

代码编辑器中有部分->以及&乱码,到我的github中有完整代码。git地址在最后

这就创建了一个收集学生成绩的链表QQ图片20160309172200

这就是创建好的链表,现在我画图来解释链表的运作blog1首先head指针指向p1的空间

blog2然后p2=p1,p2指向了p1的空间

而p1指向了新建的空间

blog3紧接着p2->next指向p1就形成了链子锁链

blog4然后p2=p1 , p2又指向了p1的空间

blog5p1又去开坑了。

只要循环不结束就会如此反复,形成一个个链表。

如果想要输出链表里的值则把main()函数中代码改成

1
2
3
4
5
6
7
8
void main()
{
struct student *p, *q;
q = creat();
for (p=1;p;p=p->next){
printf("%d, %d", p->num,p->score);
}
}

git地址 https://github.com/jetou/clinked/blob/master/lb.c