动态建立一个单向链表并输出链表
本人小白,记录一点自己的学习经历和心得,欢迎各位大佬在评论区指正!
链表
链表是一种常见的数据结构,是一种动态的进行储存分配的一种结构,相比于数组,链表不必提前定义固定的数组长度,可以避免内存浪费。(数组,如储存一个班级学生的学号,却不知道学生数目,只能把数组长度定义的足够大,这样会造成内存的浪费。)链表有多个节点,每一个节点用来储存数据。
如上图,是一个简单的单向链表,有一个头指针变量head,指向下一个结点,每一个结点会包括两个部分:1.用户需要储存的实际数据。2.下一个结点的地址。这样每一个结点都会指向下一个结点,直到最后一个结点中的指针变量被赋值为NULL。我们可以看到链表中的各个元素的地址并不连续,这是因为在开辟空间的时候是随机在内存中寻找位置,这样也就导致了在查找元素的过程中,必须找到上一元素。依次类推,如果不提供头指针,就无法访问任何一个元素。
动态建立一个单向链表并输出
结构体变量,用它去建立链表是最合适的。首先,定义一个Creat函数用来建立链表(该函数返回头指针head的地址),在函数内,定义三个指针变量,head,p,p1,指向结构体struct Studentnum{Int studentnum;struct Studentnum * pnext}.首先开辟一个结点(用到malloc函数),使p和p1指向这个结点。然后通过键盘录入学号(当学号为负使终止建立链表),使head赋值为NULL,如果录入的学号不为负,令head=p,p1=p,然后在开辟另一个空间使p指向这个空间,接着令p1->pnext=p(结构体中的指针指向下一个结点地址),p1=p。依次类推,直到录入的学号为负,终止建立链表,然后使最后一个结点的pnext为NULL,返回头指针head的地址。
链表的输出:定义一个结构体指针p2,p2=Creat()(此时p2地址为head的地址),输出数据,令p2=p2->pnext(指向下一个结点),依次类推直到最后一个结点。代码如下:
#include <stdio.h>
#include <stdlib.h>
struct Studentnum
{
int studentnum;
struct Studentnum * pnext;
} ;
struct Studentnum * Creat()//该函数返回指向链表头的指针,同时建立一个链表
{
struct Studentnum * head,* p,* p1;
int n=0;
head=NULL;
p=p1=(struct Studentnum *)malloc(sizeof(struct Studentnum));//开辟新单元
printf("请输入学号\n");
scanf("%d",&p->studentnum);
while(p->studentnum>=0)//输入学号小于零时,终止建立
{
n++;
if(n==1)
head=p;
else
p1->pnext=p;
p1=p;
p=(struct Studentnum *)malloc(sizeof(struct Studentnum));
printf("请输入学号\n");
scanf("%d",&p->studentnum);
}
p1->pnext=NULL;
return (head);
}
int main()
{
struct Studentnum * p2;
p2=Creat();
if(p2!=NULL)
do
{
printf("%d\n",p2->studentnum);
p2=p2->pnext;
}while(p2!=NULL);
}
运行结果如下:
欢迎各位大佬,在下方评论区指正,谢谢!