赞
踩
在数据结构的全部结构中中,线性结构属于最简单并且最普通的结构,而线性结构中的顺序结构属于在全部线性结构中最简单的结构
顺序表是具有相同特性的数据元素组成的一个有限序列,顺序表中的所有元素是有限个,并且呈一定的线性排列,所有元素的特性相同。可以是字符串型或者是基本整形。在长度为n的顺序表中,我们以L[0]表示顺序表的第一个元素。相当于表头。以L[n-1]表示最后一个元素。一般c语言中以0开头。
顺序表有3大特性:
(1)有穷性:顺序表中的元素是有限个的。
(2)一致性:所有的元素具有相同的数据类型。
(3)序列性:所有的元素相对位置是线性的,每个位置只存在一个元素。
顺序表排列方式如下图:
先建立一个表示顺序表的结构,代码实现如下:
- #include <stdio.h>
- #include <malloc.h>
-
- #define maxsize 50 //定义线性表的最大长度
- typedef int elemtype; //定于数据类型,elemtype的数据类型为基本整形,也可以定义为其他类型
- typedef struct
- {
- elemtype data[maxsize]; //data为是记录顺序表的地址
- int length; //length为线性表的长度
- }Sqlist;
线性表有9大基本操作,分别为
1.InitList(&L):初始化线性表,构建一个空表。
2.DestroyList(&L):销毁线性表,释放线性表中全部元素。
3.ListEmpty(L):判断线性表是否为空,若为空就返回1,不为空返回0。
4.ListLength(L):求线性表的长度然后返回线性表中元素的个数。
5.DispList(L):输出线性表,依次输出线性表中的每个元素。
6.GetElem(L,i,&e):求线性表中的第i个位置的元素值,并用e返回。
7.LocataElem(L,e):按元素值查找,返回第一个与值e元素相等的元素的位置。
8.ListInsert(&L,i,e):在第i个位置插入元素e。
9.ListDelete(&L,i,&e):删除第i个元素,并且将第i个元素值用e返回。
下面对代码实现来讲解。
首先我们通过数组来建立一个顺序表,假设有一个长度为n的数组a[n],将数组a[n]建立成一个顺序表:代码实现如下
- void CreateList(Sqlist *&L,elemtype a[],int n)
- {
- L=(Sqlist*)malloc(Sqlist); //首先给顺序表L,分配一个存储空间。
- for(int i=0;i<n;i++) //将数组a[]中的元素依次赋给顺序表中相同位置的元素。
- L->data[i]=a[i];
- L->length=n; //将顺序表中长度改为n,整个顺序表建立完成。
- }
1.初始化顺序表
初始化线性表是构造一个空表,当表的长度为0是,表中无元素,就成了一个空表,代码实现如下
- void InitList(Sqlist *&L)
- {
- L=(Sqlist*)malloc(Sqlist); //先给顺序表分配一个存储空间
- L->length=0; //在将顺序表的长度定义为0。此时,顺序表为空
- }
2.销毁顺序表
销毁顺序表是将表中全部元素都删除,释放顺序表L的存储空间,代码实现如下:
- void DestroyList(Sqlist *&L)
- {
- free(L); //释放顺序表中全部空间
- }
3.判断顺序表是否为空
该操作是通过返回顺序表长度来判断,如果顺序表长度为0,表示顺序表长度为0,则为空,返回1。若顺序表长度不为0,则返回0。代码实现如下:
- bool ListEmpty(Sqlist *L)
- {
- return (L->length==0); //L->length表示线性表的长度,若长度为0返回真,否则返回1
- }
4.返回顺序表的长度
通过求顺序表中的元素的数量,来返回顺序表的长度,L->length表示线性表的长度,相当于元素的个数,我们通过返回L->length来实现该操作,代码实现如下:
- int ListLength(Sqlist *L) //该操作需要返回一个值,需要使用int开头
- {
- return L->length; //length记录表的长度,直接返回求出元素的个数
- }
5.输出顺序表
输出顺序表是将顺序表的全部元素依次通过屏幕显示出来,从首元素开始一直到尾元素,当L为空时不显示值域
- void DispList(Sqlist *L)
- {
- for(int i=0;i<L->length;i++) //从首元素开始到尾元素,依次输出。L->length为元素个数,
- printf("%5d",L->data[i]); //从L->data[0]开始,一直到L->data[length-1];
- printf("\n");
- }
6.求顺序表中某个元素值
要求出顺序表中的第i个元素的元素值,必须先要找到第i个元素,然后在将元素值赋值给e后返回。
代码实现如下:
- bool GetElem(Sqlist *L,int i,elemtype &e) //i表示表中第i个位置
- {
- if(i<0||i>L->length) //如果i不在顺序表可以查找的范围内则返回错误。
- return false;
- else
- {
- i--; //从0开始记数,第i个位置表示为L->data[i-1];
- e=L->data[i]; //将第i个元素赋给e,然后返回真,查找完成
- return true;
- }
- }
7.按元素查找LocateElem(L,e)
扫描顺序表L中的所有元素,如果有等于e的元素,这返回改元素的位置,没有则返回0。代码实现如下:
- void LocateElem(Sqlist *L,elemtype e)
- {
- int i;
- for(i=0;i<L->length;i++) //从L->data[0]开始到L->[length-1]依次查找
- {
- if(L->data[i]==e)
- {
- return i+1; //若在表中有元素的值域为e,返回该元素的位置,循环停止。
- break;
- }
- }
- if(i==L->length) //若i=L->length则表示没有找到,返回为0
- return 0;
- }
8.插入数据元素
将某一固定的元素插入某一固定的位置,需要两个步骤,先应该将该位置后面的所有元素都向后移动一位,然后在将元素插在这个位置上面。代码实现如下:
- bool ListInsert(Sqlist *&L,int i,elemtype e)
- {
- if(i<1||i>L->length) //如果i不在L内,返回错误。
- return false;
- else //从0开始计数,将i-1;找到应该插入的位置
- {
- i--;
- for(int j=L->length;j>i;j--) //从尾部开始到i,将所有的元素向前移动一位,在将i插入。
- L->data[j]=L->data[j-1];
- L->data[i]=e;
- L->length++; //顺序表的长度增加一位,返回为真。
- return true;
- }
- }
9.删除数据元素
和插入数据元素类似,先找到需要删除元素的位置,在将该元素的值域通过e返回,在将该位置的元素覆盖,然后将后面的全部元素向前移动一位,顺序表减去一位,删除完成,代码实现如下:
- bool ListDelete(Sqlist *&L,int i,elemtype &e)
- {
- if(i<1||i>L->length) //如果i不在长度范围内,返回错误。
- return false;
- else
- {
- i--; //找到需要删除的元素的位置,使用e返回
- e=L->data[i];
- for(int j=i;j<L->length-1;j++) //从该位置到表尾的全部元素依次前移动一位
- L->data[j]=L->data[j+1];
- L->length--; //顺序表的长度减去一位,返回为真。删除完成
- return true;
- }
- }
顺序表的全部基本操作已经讲解完成,谢谢您的阅读。若有不足或者错误之处,欢迎在评论区指出,谢谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。