C语言之链表探究之单向链表(List)、附双向循环链表参考博文地址
参考博文: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)、附双向循环链表参考博文地址相关推荐
- C语言随笔小算法:单向链表
C语言随笔小算法:单向链表 参考链接: 代码参考:https://blog.csdn.net/go_sann/article/details/80508284 原理参考:https://blog.cs ...
- 2021-10-03:室友自学c语言的第五天--单向链表
国庆节快乐呀. 今天在学链表,下面是我个人对链表的理解: 链表是结构体中存放一个指针,使之指向下一个结构体的数据结构. 小明在打开鞋柜的之后,拿出了a同学的鞋子,同时又发现一张纸条,是b同学鞋柜号码. ...
- python3链表_python3实现单向链表
创建单向链表有很多种方式,个人觉得从数组创建比较方便,不多说,直接上代码 class linkNode(): """ 链表节点类 """ d ...
- java 单向链表 双向链表_java 单向链表与双向链表的实现
链表 单向链表 单向链表概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 这是一种物理结构,不是树那样的逻辑结构.链表和顺序表两种物理结构, ...
- 反转单向链表java_Java实现单向链表反转
本文实例为大家分享了Java实现单向链表反转的具体代码,供大家参考,具体内容如下 1.实现代码 public class LinkedListTest { public static void mai ...
- 【单向链表】数据结构——单向链表的介绍与代码实现笔记
从今天开始将修炼数据结构专栏,将持续更新,分模块学习. 数据结构--单向链表 一.数据结构 1.什么是数据结构? 2.逻辑结构和物理结构 二.链表--线性结构 1.首先介绍下链表和数组的区别 2.链表 ...
- java集合单向链表_Java实现单向链表数据结构
本文章同步到本人的博客站点 燕归来 链表是一种数据结构,和数组同级.比如,Java中我们使用的ArrayList,其实现原理是数组.而LinkedList的实现原理就是链表了.链表在进行循环遍历时效率 ...
- 判断两个无环单向链表/有环单向链表是否相交,并返回相交节点
题目描述:单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, 这两个链表可能相交,也可能不相交.请实现一个函数,如果两个链表相交,请返回相交 的第一个节点;如果不相交,返 ...
- c语言 链表_C语言编程第22讲——单向有序链表的C语言实现
1.单向有序链表的含义 单向有序链表可以解析为四个名词: 表:一组元素: 链表:表中的元素不是从前往后一个挨着一个,而是通过一个元素才能找到另一个元素: 单向:表中的元素只能从前往后访问: 有序:表中 ...
最新文章
- 积微论坛报告视频+PPT:用微生物组时序数据重现生物膜装配动态过程
- 斯坦福大学马腾宇:无法理解现有的深度学习算法?那就设计一个能理解的
- 异常处理程序和软件异常——Windows核心编程学习手札之二十四
- mysql启动warning: World-writable config file
- 0098 高级程序设计 c语言 在线作业,中国大学MOOC(C语言程序设计精髓)作业
- 到底能不能做一辈子的程序员——大龄程序员将何去何从
- 在Synaptic Package Manager 加载USB 接口的CD-ROM
- php jquery ajax裁剪图照片,php+jquery+ajax无刷新图片上传裁切,模拟flash头像上传实例...
- mysql 5.7参数目录_mysql5.7配置
- vue骨架屏、时间选择器、轮播图。。你想要的这里全都有
- 碧蓝航线8.20服务器维护,碧蓝航线半人马来袭 8.20更新公告
- java基础知识五、六、七、八
- 群体智能优化算法之蟑螂算法((Cockroach Swarm Optimization,CSO)
- springboot定时备份MYSQL_spring boot 定时备份数据库
- 无法启动游戏 因为计算机,win7电脑无法启动游戏怎么办?
- MTK平台sip信令的查看和volte的故障
- 用java求两个数的最大公因数_Java求两个数的最大公约数及最小公倍数、求多个数的最大公约数及最小公倍数...
- 【报错记录】解决Shell脚本报ambiguous redirect
- 必备知识:2D视觉与3D视觉分析
- python canvas画弧度_编程作战丨如何利用python绘制可爱皮卡丘?
热门文章
- springboot2.0版本后配置拦截器会导致静态资源被拦截
- android pd px sp 转换
- Owner PID: 7948 Our PID: 7064
- python中的编码和解码_Python中“is”和“==”之间的区别,以及编码和解码,与
- 计算机四级准考证ppt,计算机等级考试四级课件PPT.ppt
- Redis-主从配置
- 安卓权威编程指南 挑战练习 20.9 创建多版本主题
- bundle中vim相关快捷键的使用
- 通过Attached Property给控件绑定Command(三)
- 转一些SIFT代码链接