PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写好了,java还有三个特性,封装、继承、多态。当然这里不是讲Java,这里主要是说内部结构,大家都知道数据结构有些东西是分为逻辑结构和物理结构的,物理结构有分为顺序结构和链式结构,有不懂得可以百度百科,这里主要是分享线性表的顺序结构。那么什么是线性表呢,线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

线性表

  • 顺序表
  • 链式表

1:顺序表分析

  •   结构体创建
  •   初始化顺序表
  •   插入操作
  •   删除操作
  •   查找操作
  •   修改操作

由于顺序表比较简单,这里解释都在代码中,在外就不在赘述。

1-1:结构体的创建

#define ElemType int
#define MAXSIZE 100 //定义变量不需要分号。
//创建线性表
typedef struct {
ElemType elem[MAXSIZE];
int length; //长度
} SqList;

1-2:初始化顺序表

int InitList(SqList &L) {
// 初始化表,一个空表。
L.length = ;
return ;
}

1-3:操作方法

/**
* @descibe 插入元素
* @param L 线性表
* @param pos 所在位置(并非角标)
* @param data 插入元素
* */
int ListInsert(SqList &L, int pos, ElemType data) {
if (pos < || pos > L.length + ) {
printf("插入的不合法");
return -;
}
int i;
//在插入的同时,i要保证在pos以及pos后方,入1,2,3,4,5当在第3个插入时,须把原有的第三个数据以及以后数据后移一位,空出第三个位置。
for (i = L.length; i >= pos; i--) {
L.elem[i] = L.elem[i - ];
}
L.elem[pos - ] = data;
L.length++;
return ;//
}
/**
* 线性表中删除操作
* @param L 线性表
* @param pos 所在位置(并非角标)
* @param data 插入元素
* */
int ListDelete(SqList &L, int pos, int data) {
if (pos < || pos > L.length) {
printf("删除角标不合法");
return -;
}
if (!(L.elem[pos - ] == data)) {
printf("没有这个数字");
return -;
}
int i;
//在插入的同时,i要保证在pos以及pos后方,入1,2,3,4,5当在第3个插入时,须把原有的第三个数据以及以后数据后移一位,空出第三个位置。
for (i = pos; i <= L.length; i++) {
L.elem[i - ] = L.elem[i];
}
L.length--;
return ;//返回0表示成功;
}
//查找数据
int queryList(SqList L, int e) {
//如果小于1证明没有数据,则直接返回。
if (L.length < ) {
printf("表中没有数据");
return -;
}
for (int i = ; i < L.length; i++) {
if (L.elem[i] == e) {
printf("找到该数据:%d角标为:%d \n", L.elem[i], i);
}
}
return ;
} //修改数据
int xiugai(SqList &L, int pos, int e) {
if (pos < || pos > L.length) {
printf("修改角标不合法");
return -;
}
L.elem[pos - ] = e;
return ; }
//打印全部数据
void PrintF(SqList L) {
printf("打印表中所有元素\n");
int i;
for (i = ; i < L.length; i++) {
printf("%d\n", L.elem[i]);
}
}

综上所述:线性表和之前的数组类似,很容易理解。在使用的过程记得声明一下方法(函数);

2:链表分析

  •   结构体创建
  •   初始化顺序表
  •   插入操作
  •   删除操作
  •   查找操作
  •   修改操作

需要注意的是这里的结构体需要一个指针,前一个结点的指针指向下一个结点,依次类推,最后一个指针指向NULL;

2-1:结构体创建

/**
* @describe 创建一个结构体
* SLink *next指针;
* *SLinkListL 创建一个结构体指针
* */
typedef struct SLink {
int data;
struct SLink *next;
} SLink, *SLinkListL;

2-2:初始化链表

/**
* @describe 初始化链表
* */
SLinkListL initLinkL() {
//1:分配一个空间
SLinkListL sLinkListL = (SLinkListL) malloc(sizeof(SLink));
//2:判断是否创建成功
if (!sLinkListL) {
exit(-);
}
sLinkListL->next = NULL;
printf("初始化单链表成功\n");
return sLinkListL;
}

2-3:操作--增删该查

这里需要注意的是修改这个操作,找p的时候要找到要修改的p,而不是前一个结点,比如说,咱们在第二个位置插入的时候要找到第一个位置作为p,二修改的时候就要找到第二个位置,也就是说pos传值的时候不用减一。

/**
* @describe 插入操作
*
* @param L 链表类型
* @param pos 插入位置
* @param e 插入元素
* */
int insertLinkL(SLinkListL &L, int pos, int e) {
SLinkListL p = L;
//判断是否符合链表的长度;
int i = ;
//判断长度,寻找要插入的位置(前一位);
while (p && i < pos-) {
p = p->next;
i++;
}
//判断长度是否超过pos
if (!p || i > pos-) {
return ;
}
//为新元素创建结点(分配空间)
SLinkListL s = (SLinkListL) malloc(sizeof(SLink));
s->data = e;
s->next = p->next;
p->next = s;
return ;
} /**
* @describe 删除操作
* @param L 链表类型
* @param pos 删除位置
* @param e 删除存放元素
* */
int deleteLinkL(SLinkListL &L, int pos, int *e) {
SLinkListL p = L;
//1:判断位置
int i = ;
while (p && i < pos-) {
p = p->next;
i++;
}
if (!p || i > pos-) {
printf("删除位置不合法\n");
return -;
}
//定义一个空的变量,用于存放p的指针,入a1,a2,a3,如果要删除a2,则p指向a1,此时,把a1的next先交给s(暂存,此时代表a2(因为a1的指针是指向a2)),然后用s去取下一个指针(next)就是a3,
SLinkListL s;//s为了释放掉删除元素的空间
s = p->next;
p->next = s->next;
*e = s->data;//暂存
free(s);
printf("删除成功\n");
return ;
} /**
* @describe 查找操作
* @param L:链表类型
* @param e:e查找元素
* */
int queryLinkL(SLinkListL L, int e) {
printf("查找元素为:%d",e);
SLinkListL p = L;
int i = ;
while (p) {
p = p->next;
if (p->data == e) {
printf("找到元素%d\n", i);
return ;
}
i++;
}
printf("下标不合法/没有找到该数据");
return -;
} /**
* @describe 修改操作
* @param L:链表类型
* @param i:修改元素的位置
* @param e:修改元素值
* */
int updataLinkL(SLinkListL &L, int pos, int e) {
printf("修改数据为第:%d 个,值为:%d\n",pos,e);
SLinkListL p = L;
int i = ;
while (p && i < pos) {
p = p->next;
i++;
}
if (!p || i > pos) {
printf("修改失败--原因:修改的下标越界\n");
return -;
}
p->data = e;
printf("修改成功\n");
return ;
} void printLL(SLinkListL L) {
printf("打印全部数据\n");
SLinkListL p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}

综上所述:只多了一个指针,一开始看估计还有有看不懂的地方,按照顺序把代码粘贴到你编辑器上,运行起来慢慢看。

数据结构----线性表顺序和链式结构的使用(c)的更多相关文章

  1. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  2. C语言 线性表 双向链式结构 实现

    一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...

  3. C# 数据结构 线性表(顺序表 链表 IList 数组)

    线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. ...

  4. C#实现数据结构——线性表(下)

    线性表链式存储结构 看了线性表的顺序存储,你肯定想线性表简是挺简单,但是我一开始怎么会知道有多少人排队?要分配多大的数组?而且插入和删除一个元素也太麻烦了,所有元素都要前移/后移,效率又低. 那怎么办 ...

  5. C#实现数据结构——线性表(上)

    什么是线性表 数据结构中最常用也最简单的应该就是线性表,它是一种线性结构(废话,不是线性结构怎么会叫线性表?当然不是废话,古人公孙龙就说白马非马,现代生物学家也说鲸鱼不是鱼). 那什么是线性结构? 按 ...

  6. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  7. [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList

    一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...

  8. 线性表——顺序表的实现与讲解(C++描述)

    线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...

  9. C语言 严蔚敏数据结构 线性表之链表实现

    博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直 ...

随机推荐

  1. [蓝桥杯][2016年第七届真题]路径之谜(dfs)

    题目描述 小明冒充X星球的骑士,进入了一个奇怪的城堡. 城堡里边什么都没有,只有方形石头铺成的地面. 假设城堡地面是 n x n 个方格.[如图1.png]所示. 按习俗,骑士要从西北角走到东南角. ...

  2. Linux下安装渗透测试框架Metasploit

    我们先来说一种方法,直接从github来下载: git clone --depth=1 git://github.com/rapid7/metasploit-framework metasploit ...

  3. 4G和有线网络的自动切换

    最近项目有个需求,把移动服务器设备(Ubuntu14.04)安装4G模块,但如果连接有线时,可以自动切换到有线,以降低移动流量带来的费用. 以下是我实现的方法(经过一番痛苦的摸索) 1. 脚本/opt ...

  4. vue-cli 启动过项目步骤

    一. 安装 node.js 安装完成后,可以命令行工具中输入 node -v 和 npm -v,如果能显示出版本号,就说明安装成功. 二.安装webpack npm install webpack - ...

  5. 基于spring和mybatis的简单项目流程

    Mybatis整合Spring配置 第一部分:配置Spring框架 配置SpringMVC的步骤 配置流程图 SpringMVC配置 导入包(基本包5个,1日志依赖包,2webmvc支持包) 构建一个 ...

  6. 学习java虚拟机笔记

    虚拟机jvm 包括 类加载机制 ,运行时数据区域 运行时数据区域包括 ,程序计数器,虚拟机栈和本地方法栈,堆,方法区. 程序计数器是一块较小的内存控件, 用来指定当前字线程执行节码的行数 ,每个程序计 ...

  7. (转)【MySQL】sync_binlog innodb_flush_log_at_trx_commit 浅析

    原文:http://blog.itpub.net/22664653/viewspace-1063134/  innodb_flush_log_at_trx_commit和sync_binlog 两个参 ...

  8. (转)Linux-HA开源软件Heartbeat(配置篇)

    原文:http://ixdba.blog.51cto.com/2895551/548625 http://gzsamlee.blog.51cto.com/9976612/1828870 Linux-H ...

  9. 解决C#中dynamic类型作为泛型参数的反射问题

    C#中dynamic类型作为泛型参数传递过去后,反射出来的对象类型是object,我用老外的这篇博文中的代码跑起来,得出的结果是:Flying using a Object map (a map),将 ...

  10. 加载 Firefox 配置

    有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用 firebug在打开的页面上继续定位页面元素,调试起来不方便 .加载浏览器配置,需要用 FirefoxProfile(profile_d ...