线性表的链式存储结构

特点

  • 结点除自身的信息域外,还有表示关联信息的指针域。因此,链式存储结构的存储密度小、存储空间利用率低。
  • 在逻辑上相邻的结点在物理上不必相邻,因此,不可以随机存取,只能顺序存取。
  • 插入和删除操作方便灵活,不必移动结点只需修改结点中的指针域即可。

为什么叫链表

为了表示每个数据元素ai与其后继元素之间的逻辑关系,对ai来说,除了存储其本身信息外,还需要一个存储直接后继的位置信息。我们把数据元素信息的域叫做数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或者链。这两部分信息组成元素ai的存储映像,称为结点。

带结点的单链表实现

  • S_LinkList.h文件
#ifndef S_LinkList
#define S_LinkList
/*---------LinkList storage structure----------------*/
typedef int ElemType;
typedef struct Node
{ElemType data;/*data field*/struct Node * next;/*ptr next*/
} Node;
typedef struct Node * LinkList;/*define the LinkList*/
/*-----------------Init the LinkList------------------*/
void InitLinkList(LinkList *);
/*---------------Create the LinkList------------------*/
void CreateLinkList(LinkList*);
/*---------------Print the LinkList-------------------*/
void PrintLinkList(LinkList);
/*---------------Clear the LinkList-------------------*/
void ClearLinkList(LinkList);
/*-------------the length of the LinkList-------------*/
int LinkListLength(LinkList);
int IsEmpty(LinkList);
ElemType GetElem1(LinkList,int);
int Modify(LinkList *,int,ElemType);
int ListInsert1(LinkList*,int,ElemType);
int ListDelete1(LinkList*,int,ElemType*);
void Reverse(LinkList*);
#endif
  • .c 文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "S_LinkList.h"/*implement*/
void InitLinkList(LinkList *lp)
{*lp=NULL;printf("-------->链表初始化<---------\n");
}
void CreateLinkList(LinkList *ph)
{LinkList p,r;int i,n;(*ph)=(LinkList)malloc(sizeof(Node));r=(*ph);printf("输入创建链表的结点的个数:\n");scanf("%d",&n);for(i=0;i<n;i++){p=(Node*)malloc(sizeof(Node));scanf("%d",&p->data);r->next=p;//表尾部结点指向新结点r=p;//将当前的新节点定义为表尾部结点,实时跟踪}r->next=NULL;//表示当前链表结束
}void PrintLinkList(LinkList ph)
{LinkList tmp=ph->next;if(tmp==NULL){printf("链表为空!");}else{while (tmp!=NULL){printf("%d\t",tmp->data);tmp=tmp->next;}printf("\n打印完成!\n");}
}void ClearLinkList(LinkList *ph)
{LinkList p,q;p=(*ph)->next;while (p){q=p->next;free(p);p=q;}(*ph)->next=NULL;
}int LinkListLength(LinkList ph)
{LinkList tmp=ph;int length=0;if(tmp->next=NULL){length=0;}else{while (tmp->next->next!=NULL){length++;}length+=1;}printf("链表长度%d\n", length);  return length;
}
int IsEmpty(LinkList ph)
{int status;if(ph->next==NULL){status=1;printf("链表为空!\n");}else{status=0;printf("链表非空!\n");}return status;
}
ElemType GetElem1(LinkList ph,int pos)
{int index=0;LinkList tmp=ph->next;//First index nummber.if(pos<1){printf("pos值不合法!\n");return 0;}if(tmp==NULL){printf("链表为空!\n");return 0;}while (tmp!=NULL){++index;if(index==pos){break;}tmp=tmp->next;}if(index<pos){printf("超出索引范围!");return 0;}return tmp->data;
}
int Modify(LinkList *ph,int pos,ElemType e)
{LinkList tmp;int index;tmp=(*ph)->next;if(pos<1){printf("这个位置不合法!\n");return 0;}if(tmp==NULL){printf("链表为空!\n");return 0;}while(tmp!=NULL){++index;if(index==pos){break;}tmp=tmp->next;}if(index<pos){printf("这个位置不合法!\n");return 0;}tmp->data=e;printf("Modify后第%个数修改为%d!\n",index,tmp->data);return 1;
}
int ListInsert1(LinkList *ph,int pos,ElemType e)
{int index;LinkList p,s;//p signed as HeadLink and s is a new Link that will be added.p=(*ph);index=1;while (p&&index<pos){p=p->next;index++;}if(!p||index>pos){return 0;}s=(LinkList)malloc(sizeof(Node));s->data=e;s->next=p->next;p->next=s;printf("成功插入元素%d与%位置!\n",s->data,index);return 1;
}
int ListDelete1(LinkList *ph,int pos,ElemType *e)
{int index;LinkList p,q;p=(*ph);index=1;while (p->next&&index<pos){p=p->next;index++;}if(!(p->next)||index>pos){return 0;}q=p->next;p->next=q->next;*e=q->data;free(q);printf("删除的第%d个结点%d成功!\n",pos,*e);return 1;
}
void Reverse(LinkList *ph)
{//assign it has the head node.LinkList q,current,p;q=(*ph);current=(*ph)->next;while (current->next!=NULL){p=current->next;current->next=p->next;p->next=q->next;q->next=p;}printf("逆序链表完成!\n");
}
  • 调试结果
#include <stdlib.h>
#include <stdio.h>
#include "S_LinkList.h"int main()
{LinkList p;InitLinkList(&p);CreateLinkList(&p);PrintLinkList(p);system("pause");return 0;
}

如果有什么可以交流的欢迎大家留言一起探讨。

C语言实现线性表的链式存储结构相关推荐

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

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

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

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

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

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

  4. 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表

    文章目录 零.读前说明 一.循环链表的概述 二.循环链表的模型 2.1.包含头节点模型 2.2.不包含头节点模型 三.工程结构及简单测试案例 3.1.测试工程的目录结构 3.2.循环链表示例源码 3. ...

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

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

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

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

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

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

  8. 线性表的链式存储结构以及单链表的插入和删除原理实现

    线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...

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

    前言 线性表(顺序存储结构-用数组描述) 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的, ...

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

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

最新文章

  1. 安装Linux显示内部错误,Ubuntu14.04安装XRDP远程连接及显示内部错误解决方案
  2. oracle 文件写 n r,文本模式读写文件中\r和\n的问题
  3. mysql半同步复制
  4. 悲观锁定时如何避免可怕的死锁-以及Java 8的一些用法!
  5. mysql jooyoo net_.net连接MySQL的方法
  6. 按图索骥:SQL中数据倾斜问题的处理思路与方法
  7. sqlserver获取前一天的日期_Java8新特性时间日期库DateTime API及示例
  8. 国产Model 3高性能版规格公布:充电15分钟续航250公里
  9. MySQL数据库CPU飙升紧急处理方法
  10. ie8 不支持 position:fixed 的简单解决办法
  11. Android设计模式之单例模式
  12. 如何成为一个C++高级程序员
  13. UNIX系统V(System V)
  14. 前装车联网常见术语解释
  15. win10卸载软件_win10系统卸载软件超详细教程
  16. 5g计算机云,uawei云电脑+5G:手机能当电脑用了
  17. Spring batch批量处理框架最佳实践
  18. 第1关:伪分布式环境搭建
  19. matplotlib从折线图入门并解决中文乱码
  20. Jmeter】Jmeter:体系结构

热门文章

  1. OS + Win Office / word / excel / ppt / powerpoint / keyboard_shortcut
  2. 微信小程序实现网络请求API获取数据
  3. SQLServer数据库同步准实时解决方案
  4. linux 内核 addr2line,介绍addr2line调试命令
  5. 苹果手机怎么打印wps文档_怎么用苹果手机打印文件?
  6. IDA pro动态调试dex文件
  7. AndroidStudio中的NDK开发初探
  8. 为什么blender安装后无法打开_CAD教程:CAD软件打开图纸后钢筋符号无法读取的解决办法...
  9. android利用socket与java后台交互的设计与实现
  10. 找到微信聊天记录占空间的真正原因了