您的位置:首页 > 理论基础 > 数据结构算法

顺序表的各种基本运算

2017-11-22 15:42 211 查看

顺序表的各种基本运算

码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创

  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在此谢谢大家。下面开始正式内容

順序表是在計算機內存中以數組的形式保存的線性表,是指用一組地址連續的存儲單元依次存儲數據元素的線性結構。维基百科-顺序表

实验环境

语言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"<
4000
/span> , 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);
}


码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息