什么是链表
对链表的初步理解:链表,链表顾名思义:一条链状的表格,那么这一条链子又有什么特别的地方,这里就是重点:
1.首先这条链表的长度原则上是可以无限增加(前提是你的计算机又足够的内存),这里可以说链表最大的优势,这也是它和数组的最大区别,数组的长度是要事先定义好的,可链表不同,你要多少,它就可以给你多少,这里先粗劣讲讲链表的构成:链头+链节,首先我们要定义一个链头,然后通过mollac函数不断生成链节,并将这些链节,依次添加到链子上去,因为生成的链节数,又自己定义所以非常方便,至于具体的细节下面的代码中会详细给出
2.链子的每个链节乃至链头,其实都是特殊的结构体,特殊在这些结构体中都含有一个结构体指针,用来指向下一个链节,这就相当于为每个链节建立了联系,将分散的链节构成一条链子,想当于小朋友手拉着手了
3.既然每个连接都是结构体,那自然可以在生成连接的时候,对其进行编辑,储存信息,注意这些信息也非常重要,因为当形成链子后你想找出具体的某一个链节,就必须要通过这些信息来寻找,以上就是本人对链表的一些理解
话不多说,上代码:
#include <stdio.h>
#include <stdlib.h>//这里引入stdlib.h,因为下文要使用到malloc函数
struct student//定义一个学生类型的结构体
{
int num;
int age;
struct student *next;//结构日内定义一个结构体指针用于连接连接链节
};
struct student* head=NULL;//定义链表的头部
void creatChain(struct student *pnew);//定义一个连接链节的函数
//为什么可以将函数定义为void的类型,因为我定义的head为全局变量
void sc();//定义一个输出各链节的函数
void main()
{
int xh;
struct student* p;
printf("输入学生的学号(输入-1时停止输入):");
scanf("%d", &xh);
while(xh!=-1)//使用while循环不断生成链节,直到输入-1
{
if ((p = (struct student *)malloc(sizeof(struct student))) == NULL)
{//使用动态函数malloc生成一个sizeof(struct student)大小的空间,并判断
//计算是否又足够的空间,若能生成,将首地址赋给p
free(p);
break;
}
else
{
p->num = xh;//下面是完善各个链节的信息
printf("输入学生的年龄:");
scanf("%d", &(p->age));
creatChain(p);//调用函数将生成的链节,添加到链子上去
}
printf("输入学生的学号(输入-1时停止输入):");
scanf("%d", &xh);
}
sc();
}
void creatChain(struct student* pnew)//函数的具体操作
{
struct student* p2;
if (head == NULL)//判断是否有链头,若没有,将传递下来的链节作为链头
{
head = pnew;将=//将传递下来的链节的地址作为连头
pnew->next = NULL;//并使next指向NULL
}
else//若已经有了连头,则将链节添加到连头之后
{
for (p2 = head;p2->next!=NULL;p2 = p2->next)//找到链子最后一节所在的地址
{
}
p2->next = pnew;//将传递下来的链节,添加到链子目前最后一节的后面
pnew->next = NULL;//并使其指向NULL
}
}
void sc()
{
struct student* p;
for (p = head;p!= NULL;p = p->next)//注意于上面找链子最后一节所在的区别
{//这里每一各节点都要遍历到,因为要输出每个节点的信息
printf("学号:%d 年龄:%d\n",p->num ,p->age );
}
}
总结
要想学好链表结构体和指针一定要学好,希望大家都有所得