参考博文:C语言数据结构-创建链表的四种方法

链表结构图一

链表结构图二

链表结构图三

链表结构图四

一.静态链表

例1:

附例1代码:

#include <stdio.h>typedef struct node {int data;struct node* next;
} Node;int main()
{//2.链表内容Node a,b,c;a.data = 10;b.data = 20;c.data = 30;//3.链表链接a.next = &b;b.next = &c;c.next = NULL;   //4.链表结尾Node * head = &a;//1.链表开头while(head != NULL) {printf("data = %d\n",head->data);head = head->next;}return 0;
}

二.动态链表

  静态链表的意义不是很大,主要原因,数据存储在栈上,栈的存储空间有限, 不能动态分配。所以空链表要实现存储的自由,要动态的申请堆里的空间。

例2:


运行:

附例2代码:

#include <stdio.h>
#include <stdlib.h>
//这里创建一个结构体用来表示链表的结点类型
struct node {int data;struct node *next;
};
int main()
{struct node *head,*p,*q,*t;int i,n,a;scanf("%d",&n);head = NULL;//头指针初始为空for(i=1; i<=n; i++) { //循环读入n个数scanf("%d",&a);
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点p=(struct node *)malloc(sizeof(struct node));p->data=a;//将数据存储到当前结点的data域中p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空if(head==NULL)head=p;//如果这是第一个创建的结点,则将头指针指向这个结点elseq->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点q=p;//指针q也指向当前结点}
//输出链表中的所有数t=head;while(t!=NULL) {printf("%d ",t->data);t=t->next;//继续下一个结点}getchar();getchar();return 0;
}

2.1尾插法(略)

2.2头插法

例3



运行结果:

附例3代码:

#include <stdio.h>
#include <stdlib.h>
//这里创建一个结构体用来表示链表的结点类型
struct node {int data;struct node *next;
};
int main()
{struct node *head,*p,*q,*t;int i,n,a;scanf("%d",&n);head = NULL;//头指针初始为空for(i=1; i<=n; i++) { //循环读入n个数scanf("%d",&a);
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点p=(struct node *)malloc(sizeof(struct node));p->data=a;//将数据存储到当前结点的data域中p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空if(head==NULL)head=p;//如果这是第一个创建的结点,则将头指针指向这个结点elseq->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点q=p;//指针q也指向当前结点}scanf("%d",&a);//读入待插入的数t=head;//从链表头部开始遍历while(t!=NULL) { //当没有到达链表尾部的时候循环if(t->next->data > a) { //如果当前结点下一个结点的值大于待插入数,将数插入到中间p=(struct node *)malloc(sizeof(struct node));//动态申请一个空间,用来存放新增结点p->data=a;p->next=t->next;//新增结点的后继指针指向当前结点的后继指针所指向的结点t->next=p;//当前结点的后继指针指向新增结点break;//插入完毕退出循环}t=t->next;//继续下一个结点}
//输出链表中的所有数t=head;while(t!=NULL) {printf("%d ",t->data);t=t->next;//继续下一个结点}getchar();getchar();return 0;
}

例:创建,打印,插入,删除节点;模块化编程
本例来自:https://www.bilibili.com/video/BV1Rb411F738?t=1904

打印节点:

插入节点:

删除节点:


附上例代码:

#include<stdio.h>
#include<stdlib.h>struct Node
{int data;//数据域struct Node* next;//指针域
};//创建一个链表
struct Node* createList()
{struct Node* headNode=(struct Node*)malloc(sizeof(struct Node));//headNode成为了结构体变量//变量使用之前必须被初始化//headNode->data=1;headNode->next=NULL;return headNode;
}//创建一个节点
struct Node* createNode(int data)
{struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));newNode->data=data;newNode->next=NULL;return newNode;
}//打印节点
void printList(struct Node* headNode)
{struct Node* pMove=headNode->next;while(pMove){printf("%d\t",pMove->data);pMove=pMove->next;}printf("\n");
}//插入节点,参数:插入那个链表,插入节点的数据是多少
void insertNodeByhead(struct Node* headNode,int data)
{//1.创建插入的节点struct Node* newNode=createNode(data);newNode->next=headNode->next;headNode->next=newNode;
}//删除节点(指定位置删除)
void deleteNodeByAppoin(struct Node* headNode,int posData)
{struct Node* posNode=headNode->next;struct Node* posNodeFront=headNode;if(posNode==NULL)printf("无法删除链表为空\n");else{while(posNode->data!=posData){posNodeFront=posNode;posNode=posNodeFront->next;if(posNode==NULL){printf("没有找到相关信息,无法删除\n");return;}}posNodeFront->next=posNode->next;free(posNode);}
}int main()
{struct Node* list=createList();insertNodeByhead(list,1);insertNodeByhead(list,2);insertNodeByhead(list,3);printList(list);deleteNodeByAppoin(list,2);printList(list);return 0;
}

例:同样来自:https://www.bilibili.com/video/BV1Rb411F738?t=1904

附上例代码:

#include<stdio.h>
#include<stdlib.h>struct student
{char name[20];int num;int math;
};struct Node
{struct student data;//数据域struct Node* next;//指针域
};//创建一个链表
struct Node* createList()
{struct Node* headNode=(struct Node*)malloc(sizeof(struct Node));//headNode成为了结构体变量//变量使用之前必须被初始化//headNode->data=1;headNode->next=NULL;return headNode;
}//创建一个节点
struct Node* createNode(struct student data)
{struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));newNode->data=data;newNode->next=NULL;return newNode;
}//打印节点
void printList(struct Node* headNode)
{struct Node* pMove=headNode->next;printf("name\tnum\tmath\n");while(pMove){printf("%s\t%d\t%d\n",pMove->data.name,pMove->data.num,pMove->data.math);pMove=pMove->next;}printf("\n");
}//插入节点,参数:插入那个链表,插入节点的数据是多少
void insertNodeByhead(struct Node* headNode,struct student data)
{//1.创建插入的节点struct Node* newNode=createNode(data);newNode->next=headNode->next;headNode->next=newNode;
}//删除节点(指定位置删除)
void deleteNodeByAppoinNum(struct Node* headNode,int num)
{struct Node* posNode=headNode->next;struct Node* posNodeFront=headNode;if(posNode==NULL)printf("无法删除链表为空\n");else{while(posNode->data.num!=num){posNodeFront=posNode;posNode=posNodeFront->next;if(posNode==NULL){printf("没有找到相关信息,无法删除\n");return;}}posNodeFront->next=posNode->next;free(posNode);}
}int main()
{struct Node* list=createList();struct student info;while(1){printf("请输入学生的姓名 学号 数学成绩:");scanf("%s%d%d",info.name,&info.num,&info.math);insertNodeByhead(list,info);printf("(continue(Y/N))?");setbuf(stdin,NULL);int choice=getchar();if(choice=='N'||choice=='n'){break;}}printList(list);return 0;
}

3.链表反转

4.链表销毁


附代码:

//链表销毁
void destroyList(Node * head)
{Node * p = NULL;while(head) { //有多少个malloc就有多少个freep = head->next;free(head);head = p;}
}



C语言之双向循环链表参考博文:数据结构——双向循环链表的结构与实现(C语言)

C语言之链表探究之单向链表(List)、附双向循环链表参考博文地址相关推荐

  1. C语言随笔小算法:单向链表

    C语言随笔小算法:单向链表 参考链接: 代码参考:https://blog.csdn.net/go_sann/article/details/80508284 原理参考:https://blog.cs ...

  2. 2021-10-03:室友自学c语言的第五天--单向链表

    国庆节快乐呀. 今天在学链表,下面是我个人对链表的理解: 链表是结构体中存放一个指针,使之指向下一个结构体的数据结构. 小明在打开鞋柜的之后,拿出了a同学的鞋子,同时又发现一张纸条,是b同学鞋柜号码. ...

  3. python3链表_python3实现单向链表

    创建单向链表有很多种方式,个人觉得从数组创建比较方便,不多说,直接上代码 class linkNode(): """ 链表节点类 """ d ...

  4. java 单向链表 双向链表_java 单向链表与双向链表的实现

    链表 单向链表 单向链表概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 这是一种物理结构,不是树那样的逻辑结构.链表和顺序表两种物理结构, ...

  5. 反转单向链表java_Java实现单向链表反转

    本文实例为大家分享了Java实现单向链表反转的具体代码,供大家参考,具体内容如下 1.实现代码 public class LinkedListTest { public static void mai ...

  6. 【单向链表】数据结构——单向链表的介绍与代码实现笔记

    从今天开始将修炼数据结构专栏,将持续更新,分模块学习. 数据结构--单向链表 一.数据结构 1.什么是数据结构? 2.逻辑结构和物理结构 二.链表--线性结构 1.首先介绍下链表和数组的区别 2.链表 ...

  7. java集合单向链表_Java实现单向链表数据结构

    本文章同步到本人的博客站点 燕归来 链表是一种数据结构,和数组同级.比如,Java中我们使用的ArrayList,其实现原理是数组.而LinkedList的实现原理就是链表了.链表在进行循环遍历时效率 ...

  8. 判断两个无环单向链表/有环单向链表是否相交,并返回相交节点

    题目描述:单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, 这两个链表可能相交,也可能不相交.请实现一个函数,如果两个链表相交,请返回相交 的第一个节点;如果不相交,返 ...

  9. c语言 链表_C语言编程第22讲——单向有序链表的C语言实现

    1.单向有序链表的含义 单向有序链表可以解析为四个名词: 表:一组元素: 链表:表中的元素不是从前往后一个挨着一个,而是通过一个元素才能找到另一个元素: 单向:表中的元素只能从前往后访问: 有序:表中 ...

最新文章

  1. 积微论坛报告视频+PPT:用微生物组时序数据重现生物膜装配动态过程
  2. 斯坦福大学马腾宇:无法理解现有的深度学习算法?那就设计一个能理解的
  3. 异常处理程序和软件异常——Windows核心编程学习手札之二十四
  4. mysql启动warning: World-writable config file
  5. 0098 高级程序设计 c语言 在线作业,中国大学MOOC(C语言程序设计精髓)作业
  6. 到底能不能做一辈子的程序员——大龄程序员将何去何从
  7. 在Synaptic Package Manager 加载USB 接口的CD-ROM
  8. php jquery ajax裁剪图照片,php+jquery+ajax无刷新图片上传裁切,模拟flash头像上传实例...
  9. mysql 5.7参数目录_mysql5.7配置
  10. vue骨架屏、时间选择器、轮播图。。你想要的这里全都有
  11. 碧蓝航线8.20服务器维护,碧蓝航线半人马来袭 8.20更新公告
  12. java基础知识五、六、七、八
  13. 群体智能优化算法之蟑螂算法((Cockroach Swarm Optimization,CSO)
  14. springboot定时备份MYSQL_spring boot 定时备份数据库
  15. 无法启动游戏 因为计算机,win7电脑无法启动游戏怎么办?
  16. MTK平台sip信令的查看和volte的故障
  17. 用java求两个数的最大公因数_Java求两个数的最大公约数及最小公倍数、求多个数的最大公约数及最小公倍数...
  18. 【报错记录】解决Shell脚本报ambiguous redirect
  19. 必备知识:2D视觉与3D视觉分析
  20. python canvas画弧度_编程作战丨如何利用python绘制可爱皮卡丘?

热门文章

  1. springboot2.0版本后配置拦截器会导致静态资源被拦截
  2. android pd px sp 转换
  3. Owner PID: 7948 Our PID: 7064
  4. python中的编码和解码_Python中“is”和“==”之间的区别,以及编码和解码,与
  5. 计算机四级准考证ppt,计算机等级考试四级课件PPT.ppt
  6. Redis-主从配置
  7. 安卓权威编程指南 挑战练习 20.9 创建多版本主题
  8. bundle中vim相关快捷键的使用
  9. 通过Attached Property给控件绑定Command(三)
  10. 转一些SIFT代码链接