数据结构中线性表的顺序式表示的基本操作函数

线性表的基本操作共有十二个。我们通过对线性表基本操作的有机组合,可以处理较为复杂的线性表。

一、初始化顺序线性表——构造一个空的顺序线性表

 1 void InitList(SqList &L)
 2 {
 3        L.elem = (ElemType*)malloc(LIST_INIT_SIZE *sizeof(ELemType));//malloc函数来分配存储空间
 4        if(!L.elem)//分配存储失败
 5        {
 6             exit(OVERFLOW);
 7        }
 8        L.length = 0;//空表的长度为0
 9        L.listsize = LIST_INIT_SIZE;//初始的存储容量等于LIST_INIT_SIZE
10 }        

顺序表初始化的基本步骤:

1、开辟存储空间,使用malloc函数,个数为LIST_INIT_SIZE,每个存储元素的大小为sizeof(ElemType);

2、初始化当前的表长为0;

3、初始的存储容量为LIST_INIT_SIZE

二、销毁顺序线性表

1 void DestoryList(SqList &L)
2 {
3     free(L.elem);//释放L.elem所指的存储空间
4     L.elem = NULL;//L.elem不再指向任何存储单元
5     L.length = 0;//顺序表的长度置零
6     L.listsize = 0;//顺序表的大小也置为零
7 }

销毁顺序表的步骤:

1、用free(L.elem)释放指针所指的存储空间;

2、指针不指向任何东西,即L.elem = NULL

3、将顺序表的表长和存储容量都置为零

三、重置顺序线性表为空

1 void ClearList(SqList &L)
2 {
3     L.length = 0;//直接把当前表长置为零,判断元素的的个数就是通过当前表长来判断的
4 }

注:顺序表的当前表长已经置零,如果要存储数据的话,仍然从elem[0]开始存储,新的数据将直接覆盖原来指针中所包含的数据

四、判断顺序线性表是否为空

 1 Status ListEmpty(SqList L)
 2 {
 3     if(L.Length == 0)//如果是零返回TRUE,这里是宏定义,TRUEdai表1,FALSE 代表0
 4     {
 5         return TRUE;
 6     }
 7     else
 8     {
 9         return FALSE;
10     }
11 ]

注:Status 也是宏定义,这里代表的就是 int 整形

五、求顺序线性表中元素的个数

1 Status ListLength(SqList L)
2 {
3     return L.length;//L.length中的值代表的就是顺序表中元素的个数
4 }

六、获取顺序线性表中第i个元素的值

1 Status GetElem(SqList L,int i,ElemType &e)
2 {
3     if(i < 1 || i > L.length)//i 不在L的范围之内
4     {
5         return ERROR;
6     }
7     e = *(L.elem + i - 1);//将L的第i个元素值赋给e
8 }

七、确定顺序表中与元素e满足compare()函数的关系

 1 int LocateElem(SqList L,ElemType e,Status *(compare)(ElemType ,ElemType))
 2 {
 3     int i = 1;//i的初值为第一个元素的位序
 4     ElemType *p = L.elem;//p指向第一个元素
 5     while(i <= L.length && !compare(*p ++,e))//i没有超出表的范围并且未找到满足关系的元素
 6     {
 7         i ++;
 8     }
 9     if(i <= L.length)//找到满足关系的元素
10     {
11         return i;//返回其位序
12     }
13     else//未找到满足关系的数据
14     {
15         return 0;
16     }
17 }

注:compare()是一个函数,在其中可以定义两个元素的某种关系,比如相等、二倍等等。

八、cur_e是L中的元素,且不是第一个,用pre_e返回它的前驱

 1 Status PriorElem(SqList L, ElemType cur_e, ElemType &pre_e)// 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
 2 {
 3     int i = 2;//从第二个元素开始
 4     ElemType *p = L.elem + 1;//p指向第二个元素
 5     while (i < L.length && *p != cur_e)//i未超出表的范围,且未找到cure_e
 6     {
 7         p++;//p 指向下一个元素
 8         i++;//计数加一
 9     }
10     if (i > L.length)//到表结束还没有找到cure_e的元素
11     {
12         return ERROR;
13     }
14     else
15     {
16         pre_e = *--p;//如果成功p指向钱一个元素
17         return OK;
18     }
19 }

九、cur_e是L中的元素,且不是最后一个,用next_e返回它的前驱

 1 Status NexElem(SqList L, ElemType cur_e, ElemType &next_e)//若cur_e是L中的元素,且不是最后一个,则用next_e返回他的后继,否则操作失败,无定义
 2 {
 3     int i = 1;//从第一个元素开始
 4     ElemType *p = L.elem;//p指向第一个元素
 5     while (i < L.length && *p != cur_e)//i未找到值为cur_e的元素
 6     {
 7         p++;//p 指向下一个元素
 8         i++;//计数加一
 9     }
10     if (i == L.length)//到表尾还么有找到元素
11     {
12         return ERROR;
13     }
14     else
15     {
16         next_e = *++p;//p指向下一个元素,将所指的元素的值赋给next_e
17         return OK;
18     }
19 }

十、插入元素

 1 Status ListInsert(SqList &L, int i, ElemType e)//在L中第i个位置插入e
 2 {
 3     ElemType *newbase, *q, *p;
 4     if (i < 1 || i > L.length)
 5     {
 6         return ERROR;
 7     }
 8     if (L.length == L.listsize) //存储空间已满
 9     {
10         newbase = (ElemType *)realloc(L.elem, (L.listsize + LIST_INCREMENT)*sizeof(ElemType));
11         if (!newbase)
12         {
13             exit(OVERFLOW);
14         }
15         L.elem = newbase;//新的基址赋给L.elem
16         L.listsize += LIST_INCREMENT;//增加存储容量
17     }
18     q = L.elem + i - 1;
19     for (p = L.elem + L.length - 1; p >= q; --p)//移位
20     {
21         *(p + 1) = *p;
22     }
23     *q = e;//插入e
24     L.length++;//表长加一
25     return OK;
26 }

十一、删除元素

 1 Status ListDelete(SqList &L, int i, ElemType &e)//删除第i个元素,并用e返回其值
 2 {
 3     ElemType *p, *q;
 4     if (i < 1 || i > L.length)//i值不合法
 5     {
 6         return ERROR;
 7     }
 8     p = L.elem + i - 1;//p为被删除元素的位置
 9     e = *p;//被删除元素值赋给e
10     q = L.elem + L.length - 1;//q为表尾元素的位置
11     for (p++; p <= q; p++)
12     {
13         *(p - 1) = *p;
14     }
15     L.length--;
16     return OK;
17 }

十二、依次对每个数据元素调用visit()函数

 1 void ListTraverse(SqList L, void(*visit)(ElemType))
 2 {
 3     ElemType *p = L.elem;
 4     int i;
 5     for (i = 1; i <= L.length; i++)
 6     {
 7         visit(*p++);
 8     }
 9     printf("\n");
10 }
时间: 2024-12-17 13:33:46

数据结构中线性表的顺序式表示的基本操作函数的相关文章

数据结构中线性表的顺序式表示动态分配存储结构

顺序线性表存储结构,很容易实现随机存取线性表第i个元素的操作,但实现删除或者插入操作时需要移动大量的数据元素.所以,顺序表适应于稳定的线性表,如职工工资表和学生学籍表. 1 #define LIST_INIT_SIZE 10 //线性表存储空间的的初始分配量 2 #define LIST_INCREMENT 2//线性表存储空间分配增量 3 4 typedef int ElemType;//定义抽象数据类型ElemType为整形变量 5 6 struct Sqlist 7 { 8 ElemTyp

数据结构-线性表的链式结构

线性表的链式结构,与之前说过的线性表的顺序结构差不多,区别在于存储结构和方式的不一样. 在链式中,来一个数据就去寻找一个空间存储一个结点有多少数据占多大的地方,是动态的存储方式.另外顺序表如果存储1MB就只占1MB存储空间,但是链式表不一样,它会有额外的空间去存储对应结点的指针. 这样一分析结构就出来了,链式结构为两部分:1.结点域.2.指针域.实现方法用动态存储. 1 #include "stdio.h" 2 #include "stdlib.h" 3 4 typ

数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i

数据结构中线性表的基本操作-合并两个线性表

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素

数据结构------线性表的链式表示与实现

不多说直接上代码: #include"stdafx.h" #include <stdio.h> #include <stdlib.h> /****************************************************************************** /* 数据类型和常量定义 /***********************************************************************

线性表的链式存储的基本操作

线性表的链式存储是用结点来存储数据元素,基本结点的结构为 数据域 指针域 其中,数据域用于存放存储数据元素的值,指针域存储当前元素的直接前驱或者直接后继的位置信息,指针域中的信息称为指针(或链). 设线性表中的元素是整形,则单链表节点类型的定义为: 12345 typedef struct { int data; struct *next; /*节点的指针域*/}Node, *LinkList; 在链式存储结构下进行插入在单链表中p所指结点后插入新元素结点s(s所指结点已生成),基本步骤如下:

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

线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. (2)线性表中的元素是有限的(List),线性表中的数据类型一致. (3)线性表表示方法 L={a1,a2,a3,a4…….an},L=(D,R) (4)每一个元素都有前驱和后继,第一个元素只有后继,最后一个元素只有前驱. 实例 例如:1-100的整数是一个线性表 {“zhangsan”, “lis

《数据结构 - 线性表》链式存储 (单链表)

一:线性表定义 -<数据结构 - 线性表>顺序存储结构 二:为什么要 链式存储 线性表? - 因为在使用 顺序结构 存储方式存储的时候,每次进行 插入/删除 都需要大量移动元素的位置. - 所以设计出一种 存储空间不连续 的存储结构. - 这个线性表可能是这样的(存储位置不固定) -  三:链式存储 定义 -  因为链式存储,不是连续空间,所以需要两个信息 - 一个用于 存储数据元素,也叫做 数据域 - 一个用于 指向 下一个位置 的 指示信息,叫做指针域. - 指针域中存储的信息叫指针/链