顺序表的各种基本运算
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在此谢谢大家。下面开始正式内容
順序表是在計算機內存中以數組的形式保存的線性表,是指用一組地址連續的存儲單元依次存儲數據元素的線性結構。维基百科-顺序表
实验环境
- 语言c/c++
- 编译器devc++5.11
实验内容与要求
- 初始化顺序表;
- 依次插入a,b,c,d,e元素;
- 输出顺序表L;
- 输出顺序表L的长度;
- 判断顺序表L是否为空;
- 输出顺序表L指定位置元素;
- 输出顺序表L指定元素的位置;
- 插入元素;
- 输出顺序表L;
- 删除L元素;
- 释放顺序表。
目录
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
实验解析
结构说明
由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。
在此,我们利用C语言的结构体类型定义顺序表:
#define LIST_INIT_SIZE 100 // 线性表初始存储空间分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct{
ElemType * elem; //线性表存储空间基址
int length; //当前线性表长度
int listsize; //当前分配的线性表存储空间大小
//(以sizeof(ElemType)为单位)
}SqList;
定义说明
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char ElemType;
定义常用常量,类型别称
函数说明
顺序表函数
初始化顺序表
Status InitList_Sq(SqList &L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //构造一个空的顺序表L
if (! L.elem) exit(0); //存储分配失败
L. length=0; //空表长度为0
L.Listsize=LIST_INIT_SIZE; //初始存储容量
return OK;
}//InitList_Sq
给传入顺序表分配空间 ,成功返回1,失败则结束程序。 使用顺表一定要先初始化再使用顺序表
判空
Status EmptyList_Sq ( SqList L) {
if(L.length==0)
return TRUE;
else
return FALSE;
}
判断传入顺序表L是否为空,空返回1,不空为0
获取长度
Status LengthList_Sq ( SqList L) {
return L.length;
}
返回传入顺序表长度
打印
Status DisplayList_Sq ( SqList L){ //打印表中元素
int i ;
for(i=0;i<L.length;i++)
printf("%c" , L.elem[i]);
printf("\n");
return OK;
}
打印传入顺序表中的值到屏幕
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
插入
Status ListInsert_Sq(SqList &L, int i , ElemType e) {
//在顺序表L中第i个位置之后插入新的元素e,
// i的合法值为1≤i≤L.length+1,当i =L.length+1时
// e插在表尾
if (i<1|| i>L.length+1)
return ERROR; // i值不合法
if (L.length>=L.Listsize)
return ERROR; //顺序表已满
for (int j=L.length-1 ; j>= i-1; --j)
L.elem[j+1] =L.elem[j]; //插入位置及之后的元素后移一个位置
L.elem[i-1] =e; //插入e
L.length++; //表长增1*/
return OK;
}//ListInsert_Sq
将元素e插入顺序表L的第i位,成功返回1,失败返回0
删除
Status ListDelete_Sq(SqList &L, int i, ElemType &e) {
//在顺序表L中删除第 i个元素,并用e返回其值
// i的合法值为 1≤i≤L.length
if ((i<1)||(i>L.length))
return ERROR; // i值不合法或表空
e = L.elem[i-1] ; // 被删除元素的值赋给e
for (int j= i; j<= L.length-1; ++j)
L.elem[j-1]= L.elem[j]; //被删除元素之后的元素前移
L.length--; //表长减1
return OK;
}//ListDelete_Sq
删除顺序表L第i个元素并保存该元素到变量e,成功返回1,失败返回0
查询
Status GetElemList_Sq ( SqList L,int i,ElemType &e) {
if(i<1||i>L.length)
return ERROR;
e=L.elem[i-1];
return OK;
}
获取顺序表L的第i个元素,存到变量e中,成功返回1,失败返回0
Status LocateElemList_Sq( SqList L,ElemType e) {
int i=0;
while(i<L.length&&L.elem[i]!=e)
i++;
if(i>=L.length) return 0;
return i+1;
}
获取顺序表L中e元素第一次出现的位置,成功返回元素位置,失败返回0
释放
Status DestroyList_Sq ( SqList &L) {
if (!L.elem) return ERROR;
free (L.elem);
L.elem = NULL;
L.length = 0;
L.Listsize = 0;
return OK;
}// DestroyList_Sq
释放传入的顺序表,成功返回1,失败返回0
主函数
int main(){
SqList L;
ElemType e;
printf("(1)初始化顺序表\n");
InitList_Sq(L);
printf("(2)依次插入a,b,c,d,e元素\n");
ListInsert_Sq(L,1,'a');
ListInsert_Sq(L,2,'b');
ListInsert_Sq(L,3,'c');
ListInsert_Sq(L,4,'d');
ListInsert_Sq(L,5,'e');
ListInsert_Sq(L,3,'q');
ListInsert_Sq(L,1,'q');
printf("(3)输出顺序表:");
DisplayList_Sq(L);
printf("(4)顺序表的长度=%d\n",LengthList_Sq(L));
printf("(5)顺序表为%s\n",(EmptyList_Sq(L)?"空":"非空"));
GetElemList_Sq(L,3,e);
printf("(6)顺序表的第三个元素是%c\n",e);
printf("(7)元素a的位置=%d\n",LocateElemList_Sq(L,'a'));
printf("(8)在第四个元素插入元素f\n");
ListInsert_Sq(L,4,'f');
printf("(9)输出顺序表:");
DisplayList_Sq(L);
printf("(10)删除第三个元素\n");
ListDelete_Sq(L,3,e);
printf("(11)f元素第一次出现的位置:");
printf("%d\n",LocateElemList_Sq(L,'f'));
printf("(12)输出顺序表:");
DisplayList_Sq(L);
printf("(13)释放顺序表\n");
DestroyList_Sq(L);
}
结果展示
附录
相关资料
源代码
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
#include<stdio.h> //EOF,NULL
#include<malloc.h> //malloc()
#include<process.h> //exit()
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char ElemType;
#define LIST_INIT_SIZE 100 // 线性表初始存储空间分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct{
ElemType * elem; //线性表存储空间基址
int length; //当前线性表长度
int Listsize; //当前分配的线性表存储空间大小
//(以sizeof(ElemType)为单位)
}SqList;
Status InitList_Sq(SqList &L){
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //构造一个空的顺序表L
if (! L.elem) exit(0); //存储分配失败
L. length=0; //空表长度为0
L.Listsize=LIST_INIT_SIZE; //初始存储容量
return OK;
}//InitList_Sq
Status DestroyList_Sq ( SqList &L) {
if (!L.elem) return ERROR;
free (L.elem);
L.elem = NULL;
L.length = 0;
L.Listsize = 0;
return OK;
}// DestroyList_Sq
Status EmptyList_Sq ( SqList L) {
if(L.length==0)
return TRUE;
else
return FALSE;
}
Status LengthList_Sq ( SqList L) {
return L.length;
}
Status DisplayList_Sq ( SqList L){ //打印表中元素
int i ;
for(i=0;i<L.length;i++)
printf("%c" , L.elem[i]);
printf("\n");
return OK;
}
Status ListInsert_Sq(SqList &L, int i , ElemType e) {
//在顺序表L中第i个位置之后插入新的元素e,
// i的合法值为1≤i≤L.length+1,当i =L.length+1时
// e插在表尾
if (i<1|| i>L.length+1)
return ERROR; // i值不合法
if (L.length>=L.Listsize)
return ERROR; //顺序表已满
for (int j=L.length-1 ; j>= i-1; --j)
L.elem[j+1] =L.elem[j]; //插入位置及之后的元素后移一个位置
L.elem[i-1] =e; //插入e
L.length++; //表长增1*/
return OK;
}//ListInsert_Sq
Status ListDelete_Sq(SqList &L, int i, ElemType &e) {
//在顺序表L中删除第 i个元素,并用e返回其值
// i的合法值为 1≤i≤L.length
if ((i<1)||(i>L.length))
return ERROR; // i值不合法或表空
e = L.elem[i-1] ; // 被删除元素的值赋给e
for (int j= i; j<= L.length-1; ++j)
L.elem[j-1]= L.elem[j]; //被删除元素之后的元素前移
L.length--; //表长减1
return OK;
}//ListDelete_Sq
Status GetElemList_Sq ( SqList L,int i,ElemType &e) {
if(i<1||i>L.length)
return ERROR;
e=L.elem[i-1];
return OK;
}
Status LocateElemList_Sq( SqList L,ElemType e) {
int i=0;
while(i<L.length&&L.elem[i]!=e)
i++;
if(i>=L.length) return 0;
return i+1;
}
int main(){
SqList L;
ElemType e;
printf("(1)初始化顺序表\n");
InitList_Sq(L);
printf("(2)依次插入a,b,c,d,e元素\n");
ListInsert_Sq(L,1,'a');
ListInsert_Sq(L,2,'b');
ListInsert_Sq(L,3,'c');
ListInsert_Sq(L,4,'d');
ListInsert_Sq(L,5,'e');
ListInsert_Sq(L,3,'q');
ListInsert_Sq(L,1,'q');
printf("(3)输出顺序表:");
DisplayList_Sq(L);
printf("(4)顺序表的长度=%d\n",LengthList_Sq(L));
printf("(5)顺序表为%s\n",(EmptyList_Sq(L)?"空":"非空"));
GetElemList_Sq(L,3,e);
printf("(6)顺序表的第三个元素是%c\n",e);
printf("(7)元素a的位置=%d\n",LocateElemList_Sq(L,'a'));
printf("(8)在第四个元素插入元素f\n");
ListInsert_Sq(L,4,'f');
printf("(9)输出顺序表:");
DisplayList_Sq(L);
printf("(10)删除第三个元素\n");
ListDelete_Sq(L,3,e);
printf("(11)f元素第一次出现的位置:");
printf("%d\n",LocateElemList_Sq(L,'f'));
printf("(12)输出顺序表:");
DisplayList_Sq(L);
printf("(13)释放顺序表\n");
DestroyList_Sq(L);
}
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。