1.链表简介:
链表和数组一样,都是存储数据,链表是非连续,非顺序的存储结构
链表是灵活的内存动态管理(随机分配空间),删除创建结点非常方便
链表组成:由一系列结点组成
链表结点:实际上是结构体变量

typedef struct LINKNODE
{int data;// 数据域struct _LINKNODE *next;// 指针域
}Link_Node;

链表结点包含两个部分:
1.存储数据元素的数据域
2.存储下一个结点地址的指针域

2.链表和数组的区别
数组:一次性分配连续的存储区域
优点:随机访问元素效率搞
缺点:开辟内存过大时,易分配失败;插入和删除效率低下
链表:无需一次性分配连续的存储空间,只需要分配n块结点存储区域,通过指针建立联系
优点:不需要一次性分配连续的存储区域;删除和插入效率高
缺点:随机访问元素效率低

3.静态链表:是在初始化的时候就分配好足够的内存空间,存储空间是静态的,分配在栈上,模拟数组实现的,是顺序的存储结构

#include<stdio.h>
#include<string.h>
#include<stdlib.h>typedef struct LINKNODE{int data;struct LINKNODE *next;
}Link_Node;int main()
{Link_Node Node1={1,NULL};Link_Node Node2={2,NULL};Link_Node Node3={3,NULL};Node1.next=&Node2;Node2.next=&Node3;Node3.next=NULL;Link_Node *head=&Node1;while(head!=NULL){printf("data:[%d]\n",head->data);head=head->next;}return 0;
}

4.动态链表

#include<stdio.h>
#include<string.h>
#include<stdlib.h>typedef struct LINKNODE{int data;struct LINKNODE *next;
}Link_Node;int main()
{Link_Node *Node1=(Link_Node *)malloc(sizeof(Link_Node));Link_Node *Node2=(Link_Node *)malloc(sizeof(Link_Node));Link_Node *Node3=(Link_Node *)malloc(sizeof(Link_Node));Node1->data=1;Node2->data=2;Node3->data=3;Node1->next=Node2;Node2->next=Node3;Node3->next=NULL;Link_Node *head=&Node1;while(head!=NULL){printf("data:[%d]\n",head->data);head=head->next;}return 0;
}

5.带头链表和不带头链表
带头链表:固定一个结点作为头结点,不关心数据域,起一个标志位的作用,链表结点如何变化,此头结点固定不变
不带头结点:头结点不固定,所有结点都可以作为头,可以随机变化
6.链表按照类型又划分为:单向链表,双向链表,循环链表
7.链表的基本操作(基于单向链表)
1.创建链表结点域

typedef struct LINKNODE{int data;struct LINKNODE *next;
}Link_Node;

2.创建链表

Link_Node *Init_Link_Node()
{Link_Node *cur=NULL;//保存上一个结点 Link_Node *pNew=NULL;//辅助指针 Link_Node *head=NULL;//固定为头结点 //创建头结点 pNew=(Link_Node)malloc(sizeof(Link_Node));pNew->data=-1;pNew->next=NULL;head=pNew;cur=pNew;//head作为头结点,cur保存结点 //创建循环结点 int dataid; while(1){printf("请输入data id编号:");scanf("%d",&dataid);if(dataid<=0) break;else{//创建新结点 pNew=(Link_Node)malloc(sizeof(Link_Node));pNew->data=dataid;cur->next=pNew;//头结点(head)指向新结点 pNew->next=NULL;cur=pNew;//指针下移 }}return head;
}

3.遍历链表

int Print_Link_Node(Link_Node *head)
{if(head==NULL) return -1;else{Link_Node *cur=head->next;printf("head->");while(cur!=NULL){printf("%d->",cur->data);cur=cur->next;} printf("NULL\n");//cur指向了NULL }
}

4.在头部插入结点

void Init_Head_Link_Node(Link_Node *head,int dataid)
{if(head==NULL) return -1;else{Link_Node *cur=head->next;//保存第一个有效结点 Link_Node *pNew=(Link_Node *)malloc(sizeof(Link_Node));pNew->data=dataid;//建立关系 head->next=pNew;pNew->next=cur;}
}

5.尾部插入

void Init_Tail_Link_Node(Link_Node *head,int dataid)
{if(head==NULL) return -1;else{Link_Node *cur=head;//保存结点,获取最后一个结点 while(cur->next!=NULL){cur=cur->next;//结点后移 }Link_Node *pNew=(Link_Node *)malloc(sizeof(Link_Node));pNew->data=dataid;cur->next=pNew;pNew->next=NULL;     }
}

6.指定位置

//找到data为num的前面插入,找不到就尾插
void Init_Insert_Link_Node(Link_Node *head,int num,int dataid)
{if(head==NULL){return;}//一定记得判断headLink_Node *cur=head->next;//cur为第一个有效结点 Link_Node *pre=head;//pre保存cur的前一个结点 while(cur!=NULL){//此循环体是查找插入位置,找到则跳出循环 if(cur->next==num){break;} pre=pre->next; cur=cur->next;} Link_Node *pNew=(Link_Node *)malloc(sizeof(Link_Node));pNew->data=dataid;pre->next=pNew;pNew->next=cur; }

7.删除指定data第一个值

void Del_Link_Node(Link_Node *head,int dataid)
{if(head==NULL) return;Link_Node *cur=head->next;Link_Node *pre=head;int flag=0;while(cur!=NULL){if(cur->data==dataid){flag=1;pre->next=cur->next;free(cur);cur=NULL;break;}pre=pre->next;cur=cur->next;} if(flag==0){printf("没有找到%d的结点\n",dataid);}
}

8.释放链表

void Destroy_link_Node(Link_Node *head)
{link_Node *cur=head;while(cur->next!=NULL){head=head->next;free(cur);cur->next=NULL;cur=head;}printf("链表清空\n");
}

9.main函数

int main(int argc,char argv[])
{//创建链表 Link_Node *headLink_Node=Init_Link_Node();Print_Link_Node(headLink_Node);//头插法Init_Head_Link_Node(headLink_Node,1111);Print_Link_Node(headLink_Node);//尾插法Init_Tail_Link_Node(headLink_Node,2222); Print_Link_Node(headLink_Node);//查找插入Init_Insert_Link_Node(headLink_Node,4,3333);Print_Link_Node(headLink_Node);//删除Del_Link_Node(headLink_Node,2);Print_Link_Node(headLink_Node);//清空链表Destroy_Link_Node(headLink_Node);
}

数据结构:链表(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. 区别 eks_sport 和 exercise 有什么区别?看完你就清楚了!
  2. step by step YAML 复用
  3. UI产品设计流程中的14个要点
  4. 创建到另一个工作簿中已定义名称的外部引用的帮助(Excel)
  5. 如何实现运行时刻的多态?(c++)
  6. 计算机视觉--GIST特征及其MATLAB代码实现
  7. 六、springcloud之配置中心Config
  8. ListString^^ 引用空间
  9. oracle 12.2.0.1 搭建 active dataguard
  10. CSS自定义文件上传按钮
  11. python 埋点_scala spark 埋点统计_spark—1:WordCount(Python与Scala对照)
  12. 计算机指针知识,指针_计算机基础知识142页.ppt
  13. AT91RM9200 EK or DK开发参考
  14. 秒懂HTTPS接口(原理篇)
  15. CentOS yum方式升级内核kernel
  16. No JSON object could be decoded
  17. TL-WDN5200H无线usb网卡在ubuntu18.04/16.04上的使用
  18. java定义一个eat方法_小黄鸭系列java基础知识 | java中的方法
  19. Android WebView中打开相机拍照和选择相册
  20. linux备忘录课程设计,linux备忘录

热门文章

  1. 《看聊天记录都学不会Python到游戏实战?太菜了吧》(8)我们开始做一个数字小游戏吧
  2. 目瞪口呆!137亿年的宇宙演化,竟然如此震撼!简直颠覆想象....
  3. 排位重要还是媳妇儿重要?
  4. “中科院博士后当辅警”,网友却吵翻了:家里有矿?
  5. 绝对不能错过!2009~2019 高中数学联赛11年真题解析
  6. 三角形中惊现叛徒!自己胖的像个球,却能成就世界上最快的赛车引擎......
  7. 数学特级教师:数学除了做题目,我还必须让他们看这些!
  8. exchange服务器维护模式命令,Exchange服务器系列课程之七--维护邮件服务器(二)
  9. python notebook右侧网页_《Python web开发》笔记 一:网页开发基础
  10. 计算机课程建设 指导思想,计算机基础精品课程建设实施方案(规划).doc