C语言实现链表创建

这篇具有很好参考价值的文章主要介绍了C语言实现链表创建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言实现链表的创建

链表:是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

从链表的概念中不难得出,链表是由一系列结点组成的。
结点又包含有数据域和指针域,数据域存储数据元素,指针域则用来指向别的结点或者存储下一个结点地址,起到链接作用。


一.从百度百科的这副图片来简单理解一下链表的结构

1.创建头结点head
2.在创建一个结点用来保存每次插入的结点p1
3.循环创建一般结点p2、p3…
4.将创建的结点与已有的结点链接起来
5.遍历链表并输出数据
注意!
我们需要使用malloc函数给结点分配内存,malloc用完最好free,防止造成内存泄漏

  • 链表的优点:灵活性。插入和删除操作时,只需修改被删节点上一节点的链接地址,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点。
  • 链表的缺点: 随机访问。链表的访问取决于结点的位置,当需要随机访问结点时,在顺序存储结构中的效率低。

二.链表的相关操作

1.创建链表(前插法、尾插法、序插法、定位法)

  • 前插法:将新生成的结点依次插入头结点之后创建链表。
  • 尾插法:将新生成的结点依次插入到链表的最后面,作为新链表的最后一个结点。
  • 序插法:将新生成的结点依次插入后保证结点域数据的有序性。
  • 定位法:新生成的结点依次插入到链表中指定的位置中。

2.遍历链表:就是对于某一个数据结构中所有元素按照一定的顺序依次访问。对链表来说,就是从链表的头结点一直访问到链表的尾结点。

3.清空链表:把所有存有数据的结点清空释放出去(除了头结点以外)。

4.销毁链表: 把链表的东西全部清空,就不存在这个链表了,把包括头结点在内的所有节点释放掉。

5.链表逆序:把每一个节点指向的下一个节点的next的指针倒过来进而指向它的前面的那个节点。

三、代码示例

  • 我用尾插法来展示我对链表的理解,尾插法也是最容易理解的。
 /*尾插法建立链表*/
 #include <stdio.h>
 #include <stdlib.h>
  
 struct list     //创建链表的结构体
 {
     int    data;                //创建数据域
     struct list *next;          //创建指针域
 };
 
 int main(int argc,char *argv[])
 {
     int n;                      //设置结点的个数
     int i;                      //设置创建的结点的个数
     struct list *head = (struct list *)malloc(sizeof(struct list));//创建头结点用malloc分配内存
     head->next = NULL;          //头结点指针初始化
     struct list *p;             //创建p结点,p结点用于记录链表尾结点
     p = head;                   //p结点指针赋值为头结点
     printf("从键盘输入链表长度是:\n");                                                                                                                                 
     scanf("%d",&n);
     printf("输入数据为:\n");
              
     /* 链表的创建*/ 
     for(i=0;i<n;i++)            //循环创建结点
     {   
         struct list *p1=(struct list *)malloc(sizeof(struct list)); //创建p1结点,并分配内存
         scanf("%d",&p1->data);  //给p1结点赋值
         p->next = p1;           
         p1->next = NULL;        //让插在尾部的p1结点的指针指向NULL
         p = p1;
     }
 
      /*链表的遍历*/
     p = head;                   //从头结点开始遍历
     while(p->next != NULL)      //只要p结点下一个结点不为空,证明还有结点存在,打印p后面结点的数据
     {
         printf("%d",p->next->data);
         p = p->next;            //p结点移动到下一个结点
     }
     printf("\n");
 
     /*清空链表*/
     p=head->next;               //让p结点指向头结点下一位
     while(head->next!=NULL)     //当头结点下一位一直不为空时
     {
         head->next=p;           //将头结点下一位赋予p
         p=p->next;              //新的p结点=头结点下一位的下一位 直到尾结点=头结点
         free(head->next);
         head->next=NULL;        //确保头结点下一位为空
     }
     printf("clean the list sucessfuly!\n");
     return 0;
 }

运行得到结果显示如下:
c语言链表的创建,C语言,链表,数据结构,算法,c语言文章来源地址https://www.toymoban.com/news/detail-724774.html

到了这里,关于C语言实现链表创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构-二叉链表的结构与实现

    目录 一、引言 二、什么是二叉链表 三、二叉链表的结构 四、二叉链表的实现 1. 创建二叉链表 2. 遍历二叉链表 3. 插入节点 4. 删除节点 五、应用场景 六、总结 七、代码示例 数据结构是计算机科学中的重要概念,它是计算机程序设计的基础。二叉链表是一种常见的数据结构

    2024年02月08日
    浏览(35)
  • 【(数据结构)— 双向链表的实现】

    注意: 这里的 “带头” 跟前面我们说的 “头节点” 是两个概念,实际前面的在单链表阶段称呼不严 谨,但是为了同学们更好的理解就直接称为单链表的头节点。 带头链表里的头节点,实际为 “哨兵位” ,哨兵位节点不存储任何有效元素,只是站在这里“放哨 的” “哨

    2024年02月06日
    浏览(35)
  • 数据结构——双向链表的实现

    注意: 双向链表又称带头双向循环链表 这⾥的“带头”跟前⾯我们说的“头节点”是两个概念,实际前⾯的在单链表阶段称呼不严 谨,但是为了同学们更好的理解就直接称为单链表的头节点。 带头链表⾥的头节点,实际为“ 哨兵位 ”,哨兵位节点不存储任何有效元素,只

    2024年02月06日
    浏览(35)
  • 【数据结构】双向链表的实现

    我要扼住命运的咽喉,他却不能使我完全屈服。                      --贝多芬 目录 一.带头循环的双向链表的特点 二.不带头不循环单向链表和带头循环的双向链表的对比 三.初始化链表,创建哨兵结点 四.双向链表的各种功能的实现 1.双向链表的尾插 2.双向链表的打印 

    2023年04月10日
    浏览(30)
  • 数据结构----链表介绍、模拟实现链表、链表的使用

    ArrayList底层使用连续的空间,任意位置插入或删除元素时,需要将该位置后序元素整体往前或者往后搬移,故时间复杂度为O(N) 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后

    2024年02月21日
    浏览(35)
  • 数据结构——链表的实现(Java版)

    目录 一、链表 二、代码实现 1.创建结点 2.构造函数 3.链表的相关属性 4.添加虚拟节点 5.判断链表是否为空 6.添加方法 (1)在头部添加 (2)在尾部添加 (3)在索引位置添加 (4)对头插法和尾插法代码进行简化(调用任意位置添加的方法) 7.打印链表(遍历,重写toString方

    2024年01月23日
    浏览(39)
  • 数据结构:双向链表的实现(C实现)

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》 本篇博客,将要实现的是 带头双向循环链表 ,该结构实现尾插,尾删只需要O(1)的时间复杂度。 其结构如下所示: 既然要实现的链表是双向循环的,那么对于指针域,我们就需要 指向节点上一个的指针 和 指向节点

    2024年02月14日
    浏览(35)
  • 数据结构中链表的实现以及排序

    本期和大家主要分享的是关于数据结构中双向链表的实现过程,那么话不多说,来具体看看吧! 来分析一下,这里呢定义了一个int的数据类型,表明整个链表存放的是整形的数据;其次定义了链表节点的数据类型,其中包括了此节点存放的数据以及链接向下一个节点的地址;

    2024年02月02日
    浏览(31)
  • C语言---数据结构实验---顺序表的合并---链表的基本操作---重点解析约瑟夫问题

    实验的写法多种多样,但本文并未采用 #define 定义容量的写法,这样写已经是很老旧过时的写法。所有实验主体采用均为动态开辟,后续如果利用 C++ 来写或许会应用更多语法… 本篇展示数据结构的两个实验 其中,重点分析约瑟夫问题 实验中代码的命名风格等均与下方博客

    2024年02月16日
    浏览(35)
  • 【数据结构】 链表简介与单链表的实现

    在【数据结构】 ArrayList简介与实战中我们已经熟悉了ArrayList的使用,并且进行了简单模拟实现。通过源码知道,ArrayList底层使用数组来存储元素 由于其底层是一段连续空间, 当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包