数据结构链表,属于线性表的一部分,在数据结构中占有举足轻重的地位,对链表的理解将直接影响后期包括树、二叉树等一系列内容。

以下仅为个人在学习过程中对该内容的个人理解,其中查阅了部分资料,仅供各位学习参考,希望能给和我一样新学习的同学带来帮助,如有错误,还请指正。

链表相对顺序表的优点:

  1. 增删查改的高灵活性
  2. 内存空间的利用效率更高

相对顺序表缺点:

  1. 可能导致内存碎片化
  2. 访问没有随机性

链表对应操作:

  1. 初始化
  2. 创建链表
  3. 求表长
  4. 按序号查找
  5. 按值查找
  6. 插入链表
  7. 链表的置空
  8. 链表的遍历
  9. 链表的删除

1.初始化

LIST* Initlist(LIST* hate)
{hate = (LIST *)malloc(sizeof(LIST));Ifmalloc(hate);hate->next = NULL;return hate;
}

分配空间后置空即可。

其中的Ifmalloc(hate)为检验分配空间是否成功的操作,代码为:

void Ifmalloc(LIST* hate)
{if (hate == NULL){hate = (LIST*)malloc(sizeof(LIST));Ifmalloc(hate);}}

2.创建链表

void Creatlist(LIST* hate, int num)//分别是链表的头节点和准备需要的节点数
{//hate为头节点LIST* tail; LIST *pnew;//普通节点tail = hate;printf("请依次输入链表的元素:\n");while (num--){pnew = (LIST *)malloc(sizeof(LIST));Ifmalloc(hate);scanf("%d", &pnew->data);tail->next = pnew;tail = pnew;}pnew->next = NULL;
}

采用了一次性创建一定数量的方式,用以提高代码的灵活性。插入方式采取的尾插法。

头指针,头节点,首元节点,尾节点

头指针:指向头节点的指针,就是可以通过这个指针找到整个链表。

头节点:在首元节点前面,只有指针部分,指向首元节点。

首元节点:就是首个存数据的节点,是链表的第一个节点。

尾节点:最后一个节点,指针域为空NULL。

3.求表长

int Listlen(LIST* hate)
{int len = 0;LIST* p = hate;while (p->next != NULL){p = p->next;len++;}return len;
}

4.按序号查找

void Getlist(LIST* hate)
{LIST* p = hate;int num = 0;int len = 0;printf("请输入您要查找的元素序号:\n");scanf("%d", &num);len = Listlen(hate);if (num > 0 & num <= len){while (num--){p = p->next;}printf("%d\n", p->data);}else {printf("您的输入有误,请重新输入。\n");Getlist(hate);}
}

5.按值查找

void Getelem(LIST* hate)
{int num = 0;int sum = 0;printf("请输入您要查找的元素:\n");scanf("%d", &num);while (hate->next != NULL){hate = hate->next;sum++;if (hate->data == num){printf("%d为该元素的序号位置。\n", sum);return;}}printf("在链表中没有该元素\n");
}

6.插入链表

bool Linklist(LIST* hate)
{LIST *p,*pnew,*tail;int num = 0;tail = hate;pnew = (LIST*)malloc(sizeof(LIST));if (pnew == NULL)return false;printf("请输入您要插入的位置:\n");scanf("%d", &num);while (num-1){tail = tail->next;num = num - 1;}printf("请输入您要插入的元素:\n");scanf("%d", &pnew->data);p = tail->next;if (p->next != NULL);tail->next = pnew;pnew->next = p;return true;}

此处使用了bool数据类型,它的返回值只有两种:即true和false,但是如果返回0,其实返回的也是false,返回其他大于等于1的数就是true,用这个的目的只是尝试。

7.链表的置空

void Clearlinklist(LIST* hate)
{LIST* p = NULL;while (hate->next != NULL){p = hate->next;hate->next = p->next;free(p);}
}

8.链表的遍历

void Travellist(LIST* hate)
{LIST* p = hate;while (p->next != NULL){p = p->next;printf("%d\n", p->data);}
}

9.链表的删除

void Dellist(LIST* hate)
{LIST* tail = hate;LIST* p = NULL;int num = 0;printf("请输入您要删除的链表位置:\n");scanf("%d", &num);while (num - 1){tail = tail->next;num = num - 1;}p = tail->next;tail->next = p->next;free(p);}

代码整体

#include<stdio.h>
#include<malloc.h>//定义结构体类型
struct List
{int data;struct List* next;
};
typedef struct List LIST;LIST* Initlist(LIST* hate);//初始化链表
void Ifmalloc(LIST* hate);//检验地址分配是否有误
void Creatlist(LIST* hate, int num);//创建一定长度的链表
void Travellist(LIST* hate);//遍历链表
bool Linklist(LIST* hate);//插入链表
void Dellist(List* hate);//删除链表
int Listlen(LIST* hate);//求表格长度
void Getlist(LIST* hate);//按照序号查找元素
void Getelem(LIST* hate);//按照元素值查找
void Clearlinklist(LIST* hate);//清空链表//判断空间分配是否完成
void Ifmalloc(LIST* hate)
{if (hate == NULL){hate = (LIST*)malloc(sizeof(LIST));Ifmalloc(hate);}}//初始化头节点
LIST* Initlist(LIST* hate)
{hate = (LIST *)malloc(sizeof(LIST));Ifmalloc(hate);hate->next = NULL;return hate;
}//单链表的建立
void Creatlist(LIST* hate, int num)//分别是链表的头节点和准备需要的节点数
{LIST* tail;LIST *pnew;tail = hate;printf("请依次输入链表的元素:\n");while (num--){pnew = (LIST *)malloc(sizeof(LIST));Ifmalloc(hate);scanf("%d", &pnew->data);tail->next = pnew;tail = pnew;}pnew->next = NULL;
}//遍历链表
void Travellist(LIST* hate)
{LIST* p = hate;while (p->next != NULL){p = p->next;printf("%d\n", p->data);}
}//插入链表元素
bool Linklist(LIST* hate)
{LIST *p,*pnew,*tail;int num = 0;int len = 0;tail = hate;pnew = (LIST*)malloc(sizeof(LIST));if (pnew == NULL)return false;len = Listlen(hate);while (1){printf("请输入您要插入的位置:\n");scanf("%d", &num);if (num <= len + 1 && num > 0){while (num - 1){tail = tail->next;num = num - 1;}printf("请输入您要插入的元素:\n");scanf("%d", &pnew->data);p = tail->next;if (p->next != NULL);tail->next = pnew;pnew->next = p;return true;}else{printf("您的输入有误,请重新输入:\n");}}
}//删除链表元素
void Dellist(LIST* hate)
{LIST* tail = hate;LIST* p = NULL;int num = 0;printf("请输入您要删除的链表位置:\n");scanf("%d", &num);while (num - 1){tail = tail->next;num = num - 1;}p = tail->next;tail->next = p->next;free(p);}//求链表当前长度
int Listlen(LIST* hate)
{int len = 0;LIST* p = hate;while (p->next != NULL){p = p->next;len++;}return len;
}//按照序号查找元素
void Getlist(LIST* hate)
{LIST* p = hate;int num = 0;int len = 0;printf("请输入您要查找的元素序号:\n");scanf("%d", &num);len = Listlen(hate);if (num > 0 & num <= len){while (num--){p = p->next;}printf("%d\n", p->data);}else {printf("您的输入有误,请重新输入。\n");Getlist(hate);}
}//按照元素查找序号
void Getelem(LIST* hate)
{int num = 0;int sum = 0;printf("请输入您要查找的元素:\n");scanf("%d", &num);while (hate->next != NULL){hate = hate->next;sum++;if (hate->data == num){printf("%d为该元素的序号位置。\n", sum);return;}}printf("在链表中没有该元素\n");
}//清空链表
void Clearlinklist(LIST* hate)
{LIST* p = NULL;while (hate->next != NULL){p = hate->next;hate->next = p->next;free(p);}
}//目录
void mune()
{printf("******创建链表输入‘1’*******遍历链表输入‘2’\n");printf("******插入节点输入‘3’*******删除节点输入‘4’\n");printf("******求链表长输入‘5’*******按号查找输入‘6’\n");printf("******按值查找输入‘7’*******清空链表输入‘8’\n");
}int main()
{LIST* hate;hate = (LIST*)malloc(sizeof(LIST));int num = 0;int ch = 1;while (ch){mune();scanf("%d", &ch);switch (ch){case 1:printf("您需要创建的链表长度:\n");scanf("%d", &num);Creatlist(hate, num);break;case 2:Travellist(hate);break;case 3:Linklist(hate);break;case 4:Dellist(hate);break;case 5:printf("%d\n", Listlen(hate));break;case 6:Getlist(hate);break;case 7:Getelem(hate);break;case 8:Clearlinklist(hate);break;}}return 0;
}

以上为全部代码,对于链表的理解个人认为最为重要的是理解链表的创建部分,只要理解了链表之间是如何链接创建的以下代码自己打出来是没有问题的。

在创建链表的过程中,我认为hate头节点也只是起一个索引的作用,后面一个个节点的创建主要依靠tail作为媒介,一步步创建下去。

以上只为个人见解,仅供参考=0=

数据结构链表(C语言实现)相关推荐

  1. 用c语言实现链表数据保存,数据结构链表C语言实现.doc

    数据结构链表C语言实现 数学与信息技术学院2016~2017(下)学年 计科专业2015级<数据结构>实验报告 2 学号:2015201018 姓名:汪继超 实验名称线性表的链式存储结构完 ...

  2. 图书信息管理系统(数据结构链表,c语言版)

    图书信息管理系统 链表 一.实验题目 二.工具环境 三.实验问题 四.实验代码 五.实验总结 一.实验题目 图书信息管理系统 出版社有一些图书数据,为简单起见,在此假设每种图书只包括三部分信息:ISB ...

  3. c语言仓库管理系统链表,仓库管理系统 C语言 C++ 数据结构 链表 课程设计

    仓库管理系统 C语言 C++ 数据结构 链表 课程设计 #include #include #include #include #define MAX 64 typedef struct node{ ...

  4. c语言仓库管理系统链表,仓库管理系统 C语言 C 数据结构 链表 课程设计.doc

    仓库管理系统 C语言 C 数据结构 链表 课程设计 #include #include #include #include #define MAX 64 typedef struct node{ /* ...

  5. 数据结构(C语言版)学习笔记2-单链表

    数据结构(C语言版)学习笔记2-单链表 1.单链表定义 typedef int ElemTypes; typedef struct node {ElemTypes data; //数据域struct ...

  6. 资料分享:送你一本《数据结构(C语言版)》电子书!

    要想写出可复用.可扩展.易维护.灵活性好的代码,「数据结构」这一关必须要过啊! 在数据结构与算法的众多教材中,奉为经典的当属清华大学严蔚敏老师的著作.很多学校也选择这本书作为考研指定教材. 正在学习数 ...

  7. 资料分享:送你一本《数据结构(C#语言版)》电子书!

    对于信息类专业的学生而言,数据结构与算法是一门必修的课程.只有学好这门课程,熟练掌握线性表.栈.队列.树.图等基本结构,以及在这些结构上的各种算法,才能利用计算机去解决实际问题. 如何学好这门课程呢, ...

  8. 数据结构(C语言版) 第 八 章 排序 知识梳理 + 习题详解

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  9. 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

    目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...

  10. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

    目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...

最新文章

  1. 小猿圈Linux学习-Linux种搜索的命令
  2. 经典论文复现 | LSGAN:最小二乘生成对抗网络
  3. linux 网络错误 TCP: too many orphaned sockets 解决方法
  4. 2020-11-10(安卓如何传递数据)
  5. python当用户输入的不是整数_当用户输入字符串而不是整数时,如何保护我的python代码?...
  6. vue 引入json地图_VUE中通过Echarts引入地图
  7. 作者:庄会富(1985-),男,中国科学院昆明植物研究所科技信息中心主管
  8. iPhone 12快来了!苹果或本周公布发布会时间
  9. java通过InputStream读取文件
  10. mysql工具记录用户的查询语句_MySQL数据库的常用命令语句记录——安全用户语句及函数...
  11. 请不要滥用SharedPreference
  12. .p7b证书转成iis使用的.pfx证书
  13. 基于小米卡刷包制作属于自己刷机包
  14. 微信公众号连接服务器显示404,WordPress 微信机器人自动回复显示 404 错误解决办法...
  15. 11:c# oop思想面向对象编程(by-朝夕)
  16. docker容器端口映射
  17. 盛格塾丨品鉴《金石录后序》
  18. tf.maximum
  19. 小程序(十)签到业务流程分析
  20. 电脑用计算机软件一直闪退,电脑软件打开后闪退或崩溃的解决办法

热门文章

  1. PowerDesigner16.5下载
  2. JAVA汉化教程 自带eclipse即可无需外部工具
  3. 【渝粤题库】陕西师范大学164113 电子支付 作业(专升本)
  4. STM32F303VCT6(数据表) ARM Cortex M4,微控制器
  5. dnf强化卷代码_dnf强化卷叫什么名字?
  6. dnf一天能获得多少黑暗之眼_DNF:想快速积累史诗狗眼?这几个方法可别错过,一天最少四五个...
  7. Python爆破RAR密码
  8. 嵌入式Linux使用TFT屏幕:使用TinyDRM点亮ST7789V屏幕
  9. 驱动ST7789 240*240 TFT屏 制作分光棱镜显示要点总结(镜像后图片颜色R、B对调了,使用PS修改图片)
  10. 常用数字音频功放芯片-音频放大器