线性表链式表示和实现:初始化及查找、插入、删除的实现

  • 线性表链式实现
  • 运行
  • 双向链表插入结点
  • 双向链表删除结点

线性表链式实现

  • 用一组任意的存储单元存储线性表的数据元素(这组数据存储单元可以是连续的,也可以不连续)
#include <stdio.h>
#include <stdlib.h>
#define ERROR NULLtypedef struct LNode *PtrToLNode;
struct LNode {int Data;PtrToLNode Next;
};
typedef PtrToLNode Position;//后面是别名
typedef PtrToLNode List;/* 初始化线性表 */
PtrToLNode  MakeEmpty( )
{PtrToLNode L;L = (List)malloc(sizeof(LNode)); /* 产生头结点,并使L指向此头结点 */if (!L) /* 存储分配失败 */return 0;L->Next = NULL; /* 指针域为空 */return L;
}//表的创建(头插法:将新创建的结点添加到链表的第一个数据结点之前,作为链表新的首个数据结点)
void CreateList_L1(List &L, int m[], int n){   //此处&为引用,会改变原来值List p;int i = 0;//逆位序输入n个元素的值,建立带表头结点的单链线性表LL = (List)malloc(sizeof(LNode));L->Next = NULL;          /*初始化定义头节点,表示头节点的下一个节点为空,就是该链表只有一个头节点*/for (i = 0; i < n; i++) {p = (List)malloc(sizeof(LNode));p->Data = m[i];  //首先将插入位置之后的链表链接到新结点p上//scanf("%d", &p->Data); //输入元素值
//插入到表头p->Next = L->Next;  /* 修改新节点的指针域,使其指向头节点*/L->Next = p;   //修改头结点的指点域,使其指向新节点p}
}//表的创建(尾插法:把新来的节点插入到上一个尾部,把最后一个节点的next值赋为空)
void CreateList_L2(List &L, int m[], int n) {List p,r; //结构体指针int i = 0;//逆位序输入n个元素的值,建立带表头结点的单链线性表LL = (List)malloc(sizeof(LNode));r = L;//定义一个指针,记录每次插入变换后的最后一个节点的指针域信息for (i = 0; i < n; i++) {p = (List)malloc(sizeof(LNode));p->Data = m[i];r->Next = p; //将 r(当前还是代表头节点的地址)的下一个节点指向pr = p;       //将原本表示头部节点地址的指针赋值为新插入的节点,表示当前节点}r->Next = NULL;          /*建立一个带头结点的单链表*/
}/*求表长*/
int length(List PtrL) {List p = PtrL;  /*p指向表的第一个节点*/int j = 0;while (p) {p = p->Next; j++;  /*当前p指向表的第j个节点*/}return j;
}/* 按值查找 */
int Find(int X, List &L )
{List p = L->Next; /* p指向L的第1个结点 */while (p && p->Data != X)p = p->Next;if (p)return p->Data;elsereturn ERROR;
}/* 按序号查找 */
int Find2(int K, List &PtrL) {List p = PtrL;int i = 0;while (p != NULL && i < K) {p = p->Next;++i;}if (i == K) return p->Data;/*找到第K个,返回数据*/else  return NULL;/*否则返回NULL*/
}/*插入*/
int Insert(List &L, int i,int e ) {//在含头节点的单链线性表L中第i个位置之前插入元素eList p = L;int j = 0;while (p&&j < i - 1) { //寻找第i-1个结点p = p->Next; ++j;}if (!p || j > 1 - 1) {  //i小于1或者大于表长+1   printf("参数i错");return ERROR;  }             List s = (List)malloc(sizeof(struct LNode)); /*申请、填装,生成新结点*/s->Data = e;       s->Next = p->Next; //插入L中,新结点插入在第i-1个结点的后面p->Next = s;return 0;
}/* 删除 */
int Delete(List &L, int i)
{//在含有头结点的单链线性表PtrL中,删除第i个元素List p = L;int j = 0;while (p->Next&&j < i - 1) { //寻找第i-1个结点,并令p指向其前趋p = p->Next; ++j;}if (!p->Next || j > i - 1) {  //删除位置不合理  printf("第%d个结点不存在", i - 1);return ERROR;}List q = (List)malloc(sizeof(struct LNode)); /*申请、填装,生成新结点*/q = p->Next;       /*q指向第i个结点*/p->Next = q->Next;  free(q);        /*删除并释放结点*/return 0;
}void output(List L) {List p;p = L;printf("此时PtrL线性表元素为\n");p = L->Next;while (p) {printf("%d ", p->Data);p = p->Next;}printf("\n");
}int main() {List PtrL;//结构体指针 int p1, p2;p1 = 0;p2 = 0;int i = 0;int m[100];for (i = 0; i < 5; i++) { scanf("%d", &m[i]);}CreateList_L2(PtrL,m, 5);printf("PtrL->Data大小为%d位\n", sizeof(PtrL->Data) / sizeof(int));printf("PtrL->Data长度共%d位(包含\\0位)\n", length(PtrL));output(PtrL);printf("第1位插入1000\n");Insert(PtrL,1,1000 );printf("PtrL->Data长度共%d位(包含\\0位)\n", length(PtrL));output(PtrL);printf("删除第2位\n");Delete(PtrL,2);//删除第2位printf("PtrL->Data长度共%d位(包含\\0位)\n", length(PtrL));output(PtrL);printf("查找4的位置\n");p1= Find(4, PtrL);printf("4在PtrL第%d位\n", p1);printf("查找第1位\n");p2 = Find2(1, PtrL);printf("第1位在PtrL为%d\n", p2);return 0;
}

运行

1 2 3 4 5
PtrL->Data大小为1位
PtrL->Data长度共6位(包含\0位)
此时PtrL线性表元素为
1 2 3 4 5
第1位插入1000
PtrL->Data长度共7位(包含\0位)
此时PtrL线性表元素为
1000 1 2 3 4 5
删除第2位
PtrL->Data长度共6位(包含\0位)
此时PtrL线性表元素为
1000 2 3 4 5
查找4的位置
4在PtrL第4位
查找第1位
第1位在PtrL为1000

双向链表插入结点

双向链表删除结点

最后再释放结点free(p);

1.12 线性表的链式存储结构(C语言)相关推荐

  1. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  2. 链表list(链式存储结构实现)_5 线性表的链式存储结构

    系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...

  3. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  4. 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

    线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...

  5. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)

    线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...

  6. 数据结构开发(5):线性表的链式存储结构

    0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? ...

  7. 单链表(线性表的链式存储)---C语言版

    目录 单链表(线性表的链式存储)---C语言版 一.相关说明 二.单链表的定义 三.单链表上具体操作的实现和时间复杂度 1.初始化表.构造一个空表. 2.根据数组创建单链表 3.求表长 4.插入操作. ...

  8. 双链表(线性表的链式存储)---C语言版

    目录 双链表(线性表的链式存储)---C语言版 一.双链表的定义 二.双链表上具体操作的实现和时间复杂度 1.初始化表.构造一个空表. 2.根据数组创建双链表(头插法和尾插法) 3.插入操作.在表L中 ...

  9. 线性表(链式存储结构)C语言

    文章目录 一.线性表的链式存储结构 二.代码 1.头文件与宏定义: 2.对链表的定义及主要使用函数: 3.测试函数(主函数): 三.运行结果 一.线性表的链式存储结构 线性表的链式存储结构的特点是用一 ...

  10. Python 数据结构 之 线性表 的链式存储结构

    用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明:  Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...

最新文章

  1. Django使用Social-Auth实现微信第三方网站扫码登录
  2. tflearn 在每一个epoch完毕保存模型
  3. Qt之Q_GLOBAL_STATIC创建全局静态对象
  4. 纪中B组模拟赛总结(2019.12.21)
  5. apache+mod_wsgi配置
  6. 今日恐慌与贪婪指数为54 等级由贪婪转为中立
  7. 大神总结的机器学习的数学基础,掌握这些足够
  8. 这是用过的最差树形插件
  9. 运行QTP测试脚本后,将编译结果写入指定文件(四)
  10. [转载] 解决AndroidStudio连不上Android设备真机的问题
  11. JAVA导出EXCEL表格
  12. 敏捷管理-PDCA循环(戴明环)
  13. Lotus Symphony 正式版发布!
  14. java推送叮叮消息,叮叮叮!请及时签收入门学习Java导航路线
  15. AccessKey泄露利用
  16. 下载分享永不关机 几步玩转家庭NAS组建
  17. 将MYS_SAM9X5改为dataflash启动
  18. Libevent教程001: 简介与配置
  19. 论文复现_1:Chinese NER Using Lattice LSTM
  20. mysql查询补齐12个月_MySQL查询12个月数据,无数据补0

热门文章

  1. js页面刷新或关闭时弹框
  2. 线性系统理论2 系统状态和状态空间
  3. 冲压工艺中常见的问题,值得收藏
  4. Coap协议(1)入门简介
  5. java通过Jsoup爬取下载抖音无水印视频(下载单个抖音视频)
  6. Pytorch控制打印矩阵的格式
  7. python爬虫获取html_python3爬虫获取html内容及各属性值的方法
  8. 以太坊-区块链开发入门
  9. 【JAVA基础】Java基础之-代理详解
  10. w10怎么修改dns服务器,Win10怎么修改DNS 如何把DNS设置为百度公共DNS