数据结构线性表中的线性表的链式表示与实现算法怎么带入到主函数中

数据结构算法代码实现——线性表的顺序表示与实现(二) - CSDN博客
数据结构算法代码实现——线性表的顺序表示与实现(二)
线性表的顺序表示
线性表的顺序表示:指的是一组地址连续的存储单元依次存储线性表的数据元素。
顺序表的存储方法与特点
在日常生活中,我们通常更喜欢使用连续的存储空间来存放各种物品。
好,举个例子:假设宿舍内的床铺用编号1-6,宿舍内成员按年龄分出老大-老六,老大使用编号为1的床铺。依次类推。
这种安排方式可以使我们通过床铺编号快速找到同学。
顺序表的存储方式也与此类似,下面讨论顺序表的特点:
1. 顺序存储结构的逻辑存储和存储结构一致
2. 访问每个数据元素所花费的时间相同,利用数学公式
3. 存取元素的方法称为随机存取法,也称为随机存储结构。
顺序存储结构表示
#define LIST_INIT_SIZE 10
#define LISTADD 5
typedef struct {
ElemType *
见严蔚敏教材22页。
顺序表的基本操作(C语言)
基本操作包括了教材19页的12个操作,其中的操作也实现了教材中的2.3,2.4,2.5,2.6算法。
C语言代码:
1,先给出头文件:
#include&stdio.h&
#include&stdlib.h&
#include&malloc.h&
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int S
typedef int B
2,在给出基本操作代码:
3,然后给出测试上述操作的C代码:
4,最后在给出测试结果图:
上述操作中需要重点掌握的算法是,初始化、插入、删除等等。比较重点的基本操作在代码中都有自然语言算法描述和注释。
如需详细了解,请见教材。
下面,我们简单了解一下比较重要操作的问题:
1,书中算法2.4是插入操作:
假定插入线性表中任一元素的概率相同(都为1/n+1),则插入一个元素平均需要移动元素的个数是n/2。
个数取决于插入的位置,假定在顺序表任何插入位置的概率是相等的,则平均情况下,需要移动一半的数据元素。
2,书中算法2.5是删除操作:
假定删除线性表中任一元素的概率相同(都为1/n),则删除一个元素平均需要移动元素的个数是(n-1)/2。
删除的时间复杂度也是O(n)。
3,书中算法2.6是根据满足关系执行操作
基本操作是“进行两个元素之间的比较”,需要遍历表中的数据元素与e比较。可见时间复杂度与表的长度有关,
所以时间复杂度为O(L.length)。
较复杂的操作算法实现
上述的算法是一些基本的操作,教材中的2.1,2.2,2.7算法是较复杂的算法(多种基本操作的组合使用)。
合并后的表仍然是非递减有序排列。
1. 算法2.1
C语言算法实现:
2. 算法2.2和算法2.7 和 书中26页对2.7的改进算法 都在下述代码中
需要一个计算时间的文件,用于测试不同算法的时间:
#include &windows.h&
void kaishi(DWORD *start){
*start = GetTickCount();
void end(DWORD *stop){
*stop = GetTickCount();
void time_printf(DWORD start,DWORD stop){
printf("time: %lld ms\n", stop - start);
C语言算法实现:
首先看算法结果测试图:
然后看不同算法的时间比较图(含2.1算法union())
对于时间的比较 在最后被注释的代码,可以自行修改代码进行不同算法的时间比较 。下面我们进行两次比较:算法2.1
、算法2.2的比较 和算法2.2与2.7的比较。
(1)算法2.1、算法2.2的比较结果图:
(2)算法2.2 、算法2.7的比较结果图
对于算法的评论,可以依据时间复杂度,当然这不是评价的唯一标准。
1,首先先看算法2.1:
在此算法中的一些基本操作如GetElem、ListInsert(在表尾插入)的执行时间复杂度和表长无关。LocateElem
的执行时间和表长成正比,所以算法2.1的时间复杂度为O(ListLength(LA) * ListLength(LB))。
2,在看算法2.2:
在此算法的基本操作和算法2.1相同,但是算法时间复杂度却不同,算法2.2的时间复杂度为O(ListLength(LA) + ListLength(LB))。
从上面的时间比较图(1),就可以看出在有100000条数据时,算法2.2相对算法2.1节省了1800倍。
3,最后看算法2.7:
在此算法中的基本操作是“元素赋值”,没有上述的一些基本操作。它的时间复杂度也是O(ListLength(LA) + ListLength(LB))。
但是从上面的时间比较图(2),可以看出算法2.7相对算法2.2节省了230倍的时间。所以当两个算法的时间复杂度相同,但是由于不同的基本操作,
可能会有很多的解决方案,我们要选择最优的解决方案,否则在对于大数据的问题将很难解决。
4,算法2.7的改进是为了达到2.1的效果,具体的分析可见教材。注意的是,算法2.1只是链接两个表并去掉重复元素,想将Lb中元素插入La,
算法2.7的改进需要先对表进行数据元素的排序。由此可见,若以线性表表示集合并进行集合的各种运算,应先对表中元素进行排序。
最后讨论一下顺序存储的缺点
人无完人,金无赤足。在数据结构中也是如此,顺序表既然有特点、有优点,顺序表的缺点:
对顺序表做插入、删除时,需要大量的移动数据元素。
线性表需要预先分配空间,必须按最大空间分配,存储空间得不到充分利用,造成内存浪费。
本文已收录于以下专栏:
相关文章推荐
线性表的链式表示
使用一组任意的存储单元存储线性表的数据元素(这些存储单元可以是连续也可以是不连续的)。
常见的链式表:单链表、静态链表、循环链表、双向链表。
链表的存储方式和特点我们修...
数据的在计算机的存储方式分为:连续存储【数组】,非连续存储【链表、树、图and so on】;今天讨论的将是数组,包括数组的创建、打印输出,在数组后面追加元素,判断数组是否为空,判断数组是否为满,在数...
观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是GUI系统、订阅——发布系统等。因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以GUI系统来说,应用的UI...
关注公众号
在公众号里回复“”秘密“”两个字
http://task.csdn.net/m/task/home?task_id=398 领取奖励
提示:根据公众号里的自动回复,完成...
LinearLayout xmlns:android=&/apk/res/android&
xmlns:app=&http://schema...
JavaEE 6及以上版本的web.xml问题?MyEclipse JavaEE 6版本开始web.xml突然消失不见?没这回事,只是不太必须而已,有需要的项目可以自行进行添加或在创建项目的时候点击n...
maven依赖:
redis.clients
增加spring 配置
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)404 - 找不到文件或目录。
404 - 找不到文件或目录。
您要查找的资源可能已被删除,已更改名称或者暂时不可用。数据结构与算法总结1_常用的数据结构(线性表)
这里会介绍线性表,数组,背包,队列和栈。
会根据内容的多少将这些数据结构分开进行介绍。
关于数,图以及字符串的内容会在后面的算法里介绍。
先说一下我对这些基本的数据结构的认识,因为我并没有什么实践经验,而且也没怎么真正用过这些数据结构,所以可能只是自己的一家之谈。我认为这些数据结构重要的是其所包含的思想(当然不懂实现,就真的是纸上谈兵了)。队列是一种先进先出的数据结构,栈是一种先进后出的数据结构。我们说栈和队列的时候,说的是先进先出和先进后出这种思想而不是说其具体实现。
这些基本思想简单的几句话就说完了,在这个博客里,重点介绍的还是这些数据结构以及其操作的实现。
线性表是0个或多个数据元素的有限序列。序列说明了各个数据元素之间是有顺序关系的。
在这里说一下线性表的基本操作有哪些?
InitList(*L); //初始化操作,建立一个空的线性表L
ClearList(*L); //将线性表L清空
GetElem(L,i,*e); //将线性表L的第i个位置元素值返回给e
ListInsert(*L,i,e); //在线性表L的第i个位置插入新元素e
ListDelete(*L,i,*e);//删除线性表L中的第i个位置元素,并用e返回其值
ListLength(L); //返回线性表的元素个数
线性表还有很多操作,这里就只介绍这几种
线性表有两种实现方式:顺序表示 以及 链式表示。
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。一般都是通过数组去实现线性表的顺序表示。
线性表的链式表示就是我们通常所说的链表了。
3.线性表的顺序表示
这里可以通过动态数组或者静态数组实现。
静态数组版本:
#define MAXSIZE 20
//线性表的初始大小
typedef int ElemT
//线性表中的元素类型
typedef struct
ElemType data[MAXSIZE];
//通过静态数组定义线性表结构体
void InitList(SqList *L)
//初始化操作,建立一个空的线性表L
L-&length=0;
void GetElem(SqList L, int i, ElemType *e)
//将线性表L的第i个位置元素值返回给e
if ( (L.length==0)||(i&1)||(i&L.length) )
printf(&出错\n&);
*e=L.data[i-1];
void ListInsert(SqList *L,int i,ElemType e)
//在线性表L的第i个位置插入新元素e
if(L-&length==MAXSIZE)
printf(&线性表已满\n&);
if(i&1||i&L-&length+1)
printf(&插入位置出错\n&);
for(int k=L-&k&=i;k--)
L-&data[k]=L-&data[k-1];
L-&data[i-1]=e;
L-&length++;
void ListDelete(SqList *L,int i,ElemType *e)
//删除线性表L中的第i个位置元素,并用e返回其值
if(L-&length==0)
printf(&线性表为空\n&);
if(i&1||i&L-&length)
printf(&位置出错\n&);
*e=L-&data[i-1];
for(int k=i;kk++)
L-&data[k-1]=L-&data[k];
L-&length--;
int ListLength(SqList L)
//返回线性表的元素个数
void show(SqList L)
for(int i=0;i
动态数组版本:(只有结构体的定义和线性表的初始化上和上面的有所不同)
#define MAXSIZE 20
//线性表的初始大小
typedef int ElemT
//线性表中的元素类型
typedef struct
ElemType *
//通过动态数组定义线性表结构体
void InitList(SqList *L)
//初始化操作,建立一个空的线性表L
L-&data=(ElemType *)malloc(MAXSIZE * sizeof(ElemType));
if(!L-&data)
//内存分配失败
L-&length=0;
void GetElem(SqList L, int i, ElemType *e)
//将线性表L的第i个位置元素值返回给e
if ( (L.length==0)||(i&1)||(i&L.length) )
printf(&出错\n&);
*e=L.data[i-1];
void ListInsert(SqList *L,int i,ElemType e)
//在线性表L的第i个位置插入新元素e
if(L-&length==MAXSIZE)
printf(&线性表已满\n&);
//这里可以通过realloc函数扩展线性表的大小,略
if(i&1||i&L-&length+1)
printf(&插入位置出错\n&);
for(int k=L-&k&=i;k--)
L-&data[k]=L-&data[k-1];
L-&data[i-1]=e;
L-&length++;
void ListDelete(SqList *L,int i,ElemType *e)
//删除线性表L中的第i个位置元素,并用e返回其值
if(L-&length==0)
printf(&线性表为空\n&);
if(i&1||i&L-&length)
printf(&位置出错\n&);
*e=L-&data[i-1];
for(int k=i;kk++)
L-&data[k-1]=L-&data[k];
L-&length--;
int ListLength(SqList L)
//返回线性表的元素个数
void show(SqList L)
for(int i=0;i
通过数组实现线性表有一个特别明显的缺点:插入和删除操作需要移动大量的元素。
这就使得这种实现显得特别笨重,不够灵活。
4.线性表的链式表示
线性表的链式表示:不要求元素一定要存放在连续的内存中,这就使得这种表示比上面的顺序表示灵活的多。
单链表(线性链表)
明确两个概念的区别:头指针和头结点
头指针:指向链表第一个结点的指针。
头结点:为了操作的统一和方便,在第一个元素的结点之前再加入一个结点,这个结点的数据域一般是没有意义的。头结点对链表来说不是必须的。
不对链表做过多的介绍,百度随便一搜一大堆。直接贴代码。
#define MAXSIZE 20
//线性表的初始大小
typedef int ElemT
//线性表中的元素类型
typedef struct Node
//定义单链表的结点结构体
typedef Node* LinkL
void CreateList1(LinkList *L,int n)
//创建一个带头结点的单链表 ,前插
*L=(LinkList)malloc(sizeof(Node));
(*L)-&next=NULL;
for (int i=n;i&0;i--)
LinkList p=(LinkList)malloc(sizeof(Node));
scanf(&%d&,&p-&data);
p-&next=(*L)-&
(*L)-&next=p;
void CreateList2(LinkList *L,int n)
//创建一个带头结点的单链表 ,后插
*L=(LinkList)malloc(sizeof(Node));
(*L)-&next=NULL;
LinkList r=*L;
for (int i=n;i&0;i--)
LinkList p=(LinkList)malloc(sizeof(Node));
scanf(&%d&,&p-&data);
p-&next=NULL;
r-&next=p;
void GetElem(LinkList L, int i, ElemType *e)
//将线性表L的第i个位置元素值返回给e
LinkList p=L-&
while(p&&(j
if(!p||(j&i))
//p为空或者i&1
printf(&出错\n&);
void ListInsert(LinkList *L,int i,ElemType e)
//在线性表L的第i个位置插入新元素e
LinkList p=*L;
while(p&&(j
if(!p||(j&i))
//p为空或者i&1
printf(&出错\n&);
//和GetElem()函数有所不同,这里p指向插入位置的前一个结点
LinkList s=(LinkList)malloc(sizeof(Node));
s-&data=e;
s-&next=p-&
p-&next=s;
void ListDelete(LinkList *L,int i,ElemType *e)
//删除线性表L中的第i个位置元素,并用e返回其值
LinkList p=*L;
while(p&&(j
if(!p||(j&i))
//p为空或者i&1
printf(&出错\n&);
//和GetElem()函数有所不同,这里p指向删除位置的前一个结点
LinkList s=p-&
p-&next=s-&
int ListLength(LinkList L)
//返回线性表的元素个数
LinkList p=L-&
return j-1;
void show(LinkList L)
LinkList p=L-&
printf(&%d
&,p-&data);
printf(&\n&);
void ClearList(LinkList *L)
//删除线性表
LinkList p,q;
p = (*L)-&
void main()
LinkList L;
CreateList2(&L,3);
printf(&%d\n&,ListLength(L));
ListInsert(&L,2,777);
ListDelete(&L,2,&e);
ListInsert(&L,2,888);
ListDelete(&L,3,&e);
ListDelete(&L,3,&e);
GetElem(L,1,&e);
printf(&%d\n&,e);
printf(&%d\n&,ListLength(L));
ClearList(&L);
CreateList1(&L,3);
5.链表的扩展
静态链表:
循环链表:
双向链表:
6.常见的一些题目数据结构单元2练习参考答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
数据结构单元2练习参考答案
SAP BASIS|
总评分3.9|
浏览量49260
用知识赚钱
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢《数据结构》期中试题(有答案)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
《数据结构》期中试题(有答案)
&&数据结构期中考试
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 数据结构线性表的实现 的文章

 

随机推荐