线性表的链式存储结构(C语言实现)
由于线性表的顺序存储结构在进行插入与删除是要移动大量的元素,会耗费大量的时间,线性表的链式存储结构就完美的解决了这个问题。
首先是单链表的创建,有头插法和尾插法。
- 头插法:
/* 随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
void CreateListHead(LinkList *L, int n)
{LinkList p;int i;srand(time(0)); /* 初始化随机数种子 */*L = (LinkList)malloc(sizeof(Node));(*L)->next = NULL; /* 先建立一个带头结点的单链表 */for (i=0; i<n; i++) {p = (LinkList)malloc(sizeof(Node)); /* 生成新结点 */p->data = rand()%100+1; /* 随机生成100以内的数字 */p->next = (*L)->next; (*L)->next = p; /* 插入到表头 */}
}
2.尾插法:
/* 随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
void CreateListTail(LinkList *L, int n)
{LinkList p,r;int i;srand(time(0)); /* 初始化随机数种子 */*L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */r=*L; /* r为指向尾部的结点 */for (i=0; i<n; i++) {p = (Node *)malloc(sizeof(Node)); /* 生成新结点 */p->data = rand()%100+1; /* 随机生成100以内的数字 */r->next=p; /* 将表尾终端结点的指针指向新结点 */r = p; /* 将当前的新结点定义为表尾终端结点 */}r->next = NULL; /* 表示当前链表结束 */
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct Node{int data;struct Node *next;
}Node;
typedef struct Node *LinkList;/*头插法创建单链表*/
void CreateListHead(LinkList *L, int n){LinkList p;int i;srand(time(0));*L = (LinkList)malloc(sizeof(Node));(*L)->next = NULL;for (i = 0; i < n; i++){p = (LinkList)malloc(sizeof(Node));p->data = rand() % 100 + 1;p->next = (*L)->next;(*L)->next = p;}
}
/*尾插法创建单链表*/
void CreateListTail(LinkList *L, int n){LinkList p, r;int i;srand(time(0));*L = (LinkList)malloc(sizeof(Node));r = *L;//r为指向尾部的结点for (i = 0; i < n; i++){p = (LinkList)malloc(sizeof(Node));p->data = rand() % 100 + 1;r->next = p;r = p; //将p结点赋值给r,使r始终是尾结点}r->next = NULL;
}/*单链表的插入*/
void ListInsert(LinkList *L, int i, int e){LinkList p,s;p = *L;int j=1;while (p&&j<i) //寻找第i-1个结点{p = p->next;j++;}if (!p&&j>i)exit(0);//第i个结点不存在s = (LinkList)malloc(sizeof(Node));s->data = e;s->next = p->next;p->next = s;
}
/*单链表的删除*/
void ListDelete(LinkList *L, int i){LinkList p, q;p = *L;int j = 1;while (p->next&&j<i) //寻找第i-1个结点{p = p->next;j++;}if (!(p->next) && j>i) exit(0);q = p->next;p->next = q->next;free(q);
}
void visit(int c){printf("%d ", c);
}
void ListPrint(LinkList L){LinkList p = L->next;while (p){visit(p->data);p = p->next;}printf("\n");
}
int main(){LinkList m, n;int k = 6;CreateListHead(&m,k);ListPrint(m);CreateListTail(&n, k);ListPrint(n);ListInsert(&m, 5, 11);ListDelete(&n, 3);ListPrint(m);ListPrint(n);system("pause");return 0;
}
单链表的插入与删除的关键都是要先找到要操作位置的前一个结点,而插入与删除不同,对于找到第i-1个结点,插入是while (p&&j
线性表的链式存储结构(C语言实现)相关推荐
- 数据结构和算法:(3)3.2线性表的链式存储结构
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...
- 链表list(链式存储结构实现)_5 线性表的链式存储结构
系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...
- 从零开始学数据结构和算法(二)线性表的链式存储结构
链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...
- 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...
- 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...
- 数据结构开发(5):线性表的链式存储结构
0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? ...
- 线性表(链式存储结构)C语言
文章目录 一.线性表的链式存储结构 二.代码 1.头文件与宏定义: 2.对链表的定义及主要使用函数: 3.测试函数(主函数): 三.运行结果 一.线性表的链式存储结构 线性表的链式存储结构的特点是用一 ...
- Python 数据结构 之 线性表 的链式存储结构
用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明: Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...
- 【数据结构】CH2 线性表的链式存储结构
目录 一.链表概述 1.相关定义 二.单链表 1.插入和删除节点的操作 (1)插入结点 (2)删除结点 2.建立单链表 (1)头插法 (2)尾插法 3.线性表基本运算在单链表中的实现 (1)初始化线性 ...
- 线性表的链式存储结构以及单链表的插入和删除原理实现
线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...
最新文章
- SDN 网络技术创新探索 | 移动云 TeaTalk 线上直播 倒计时启动中
- 结对代码 复审 意见
- php 获取文件后缀_php获取文件后缀的9种方法
- setTimeout() 实现程序每隔一段时间自动执行
- React开发(275):dva debugger对应的值
- 记一次ElasticSearch重启之后shard未分配问题的解决
- 笨方法学python第四版当当_“笨办法”学Python(第3版)
- autotools归纳
- LQR控制算法及其仿真实现
- 小米5安装googleplay框架
- html 在行前显示黑点,Word里有些文字行前面有小黑点是怎么回事?
- ROS实验笔记之——JCV-450无人机初入门
- 一个小玩意 PHP实现微信红包金额拆分试玩
- 修改下拉状态栏点击屏幕录制后出现ANR。禁用Hotspot tethering菜单下的 “Wi-Fi hotspot。默认系统语言为英文。
- Golang停止ticker断续器
- python爬虫点触验证码的识别思路(图片版)
- Lazada代入驻靠谱?Lazada代入驻多少钱?
- 如何将计算思维融合到C语言程序设计中,利用案例融合计算思维与C语言教学
- ubuntu容器下时区修改方法
- 魔术师的猜牌术(一维数组) C++程序
热门文章
- python xlsxwriter下载_python_xlsxwriter模块
- 深度学习常用框架和基础模型
- 谁有《线性系统理论习题与解答》郑大钟
- 【总结】计算机网络常用协议总结------结合cpri
- vue组件库开发遇到的regeneratorRuntime is not defined
- java sql编写教务系统_教务管理系统的设计与实现(SQLServer)
- 广州市黄埔区水利工程管理划定带动水利人才上升
- 【微信小程序 | 实战开发】开发环境、测试环境和生产环境
- 软件测试理论知识总结
- Android ndk开发入门集锦一