C语言:动态建立一个单向链表并输出

动态建立一个单向链表并输出链表

本人小白,记录一点自己的学习经历和心得,欢迎各位大佬在评论区指正!

链表

链表是一种常见的数据结构,是一种动态的进行储存分配的一种结构,相比于数组,链表不必提前定义固定的数组长度,可以避免内存浪费。(数组,如储存一个班级学生的学号,却不知道学生数目,只能把数组长度定义的足够大,这样会造成内存的浪费。)链表有多个节点,每一个节点用来储存数据。
图一
如上图,是一个简单的单向链表,有一个头指针变量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);
  } 

运行结果如下:
在这里插入图片描述

欢迎各位大佬,在下方评论区指正,谢谢!

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值