#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 1000 //顺序表能达到的最大长度
#define SIZECREATE 100
#define OK 1
#define ERROR 0
//return 0:返回假,正常终止
//return 1:返回真,非正常终止
//typedef可用来自定义数据类型
typedef int ElemType;
typedef int Status;
typedef struct Sqlist{
ElemType *elem; //创建存储空间的基地址
int length; //定义顺序表当前长度
int listSize; //当前分配的存储容量
}Sqlist; //顺序表的结构类型为Sqlist
void menu(){
printf("************************************\n");
printf("***********顺序表功能实现***********\n");
printf("******(0) 退出程序******************\n");
printf("******(1) 初始化线性表**************\n");
printf("******(2) 创建线性表****************\n");
printf("******(3) 插入元素******************\n");
printf("******(4) 删除元素******************\n");
printf("******(5) 获取指定位置元素的值******\n");
printf("******(6) 查找元素的位置************\n");
printf("******(7) 输出顺序表****************\n");
printf("******(8) 判断线性表是否为空********\n");
printf("******(9) 求指定元素的前驱元素******\n");
printf("******(10) 求指定元素的后继元素*****\n");
printf("************************************\n");
printf("************************************\n");
printf("\n");
}
//初始化线性表
Status InitList(Sqlist *L){ //构造一个空的顺序表L
L->elem=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE); //为顺序表L分配一个新的存储空间,大小为MAXSIZE
if(!L->elem){
printf("内存分配失败!\n");
exit(0); //异常处理
}
L->length = 0; //初始顺序表的长度为0
L->listSize=MAXSIZE;
printf("内存分配成功!\n");
}
//创建顺序表
void CreateList(Sqlist *L){
int n;
int i;
printf("请输入你要创建的顺序表的元素的个数:");
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&L->elem[i]); //在这里显示让你接着输入元素
L->length+=1;
}
}
//打印线性表
void DipList(Sqlist L){
int i=0;
for(i=0;i<L.length;i++){
printf("%d",L.elem[i]);
}
printf("\n");
}
//判断线性表是否为空
int ListEmpty(Sqlist L){
if(L.length==0){
return 1;
}else{
return 0;
}
}
//返回一个指定元素的前驱元素
int PriorElem(Sqlist L,ElemType e1,ElemType *e2){
int i=0;
for(i=0;i<L.length;i++){ //在下标为0到下标为L.length的范围循环
if(L.elem[i]!=e1){ //如果线性表L中下标i的元素不等于指定元素e1
continue; //结束本次循环,进入下一次循环
}else{
break; //如果等于,结束循环
}
}
if(i!=0){
*e2=L.elem[i-1]; //e2为e1前驱元素
return 1;
}else{
return 0;
}
}
//返回一个指定元素的后继元素
int NextElem(Sqlist L,ElemType e1,ElemType *e2){
int i=0;
for(i=0;i<L.length;i++){
if(L.elem[i]!=e1){
continue;
}else{
break;
}
}
if(i!=L.length-1){
*e2=L.elem[i+1];
return 1;
}else{
return 0;
}
}
//顺序表的取值(根据位置i获取该位置对应的元素e)
Status GetElem(Sqlist L,int j,ElemType *e){
if(j<1||j>L.length){
return ERROR; //异常处理
}
*e = L.elem[j-1];
return OK;
}
//顺序表的查找
int LocateElem(Sqlist L,ElemType e){
int i;
for(i=0;i<L.length;i++){
if(L.elem[i]==e){
return i+1; //查找元素的位置
}
}
return 0;
}
//顺序表的插入
Status ListInset(Sqlist *L,int j,ElemType e){
int i=0;
printf("请输入你想要插入的元素:");
scanf("%d",&e);
printf("请输入你想要插入的位置:");
scanf("%d",&j);
if(j<1||j>L->length+1){ // j表示元素位置
printf("插入的位置非法!");
exit(0);
}
if(L->length>=MAXSIZE){ //内存空间满了,增加分配
ElemType *newbase=(ElemType*)realloc(L->elem,(L->listSize+SIZECREATE)*sizeof(ElemType));
if(!newbase){
printf("内存分配失败!\n");
return ERROR;
}
L->elem=newbase; //新基地址
L->listSize=L->listSize+SIZECREATE; //增加存储容量
}
for(i=L->length-1;i>=j-1;i--){ //从顺序表中最后一个元素开始,i表示元素下标(下标从0开始)
L->elem[i+1]=L->elem[i]; //把下标i的元素赋值给i+1这个位置
}
L->elem[j-1]=e; //插入元素下标=插入位置-1
L->length+=1;
return OK;
}
//顺序表的删除
Status ListDelete(Sqlist *L,int j){
int i;
printf("请输入想要删除第几个元素:");
scanf("%d",&j);
if(j<1||j>L->length){
printf("删除元素位置为无效!\n");
return 0;
}
for(i=j;i<=L->length-1;i++){
L->elem[i-1]=L->elem[i];
}
L->length-=1;
return OK;
}
int main(){
Sqlist L;
int key,i,j,k,a,b;
ElemType e;
menu();
while(1){
printf("请选择功能(0-10):");
scanf("%d",&key);
switch(key){
case 1: //初始化线性表
InitList(&L);
break;
case 2: //创建线性表
CreateList(&L);
break;
case 3: //插入元素
ListInset(&L,j,e);
break;
case 4: //删除元素
ListDelete(&L,j);
break;
case 5: //获取指定位置元素的值
printf("请输入你想要知道位置的元素:");
scanf("%d",&j);
GetElem(L,j,&e);
printf("第%d个元素的值为:%d\n",j,e);
break;
case 6: //查找元素的位置
printf("请输入你想要查找的元素:");
scanf("%d",&e);
j=LocateElem(L,e);
printf("%d在线性表中的位置是:%d\n",e,j);
break;
case 7: //打印顺序表
DipList(L);
break;
case 8: //判断线性表是否为空
j=ListEmpty(L);
if(j==1)
printf("线性表为空表\n");
else
{
printf("线性表非空\n");
}
break;
case 9: //求指定元素的前驱元素
printf("请输入你想知道的前驱元素的值:");
scanf("%d",&a);
j=PriorElem(L,a,&b);
if(j==1){
printf("%d的前驱元素是:%d\n",a,b);
}
if(j==0){
printf("此元素无前驱元素\n");
}
break;
case 10: //求指定元素的后继元素
printf("请输入你想知道的后继元素的值:");
scanf("%d",&a);
j=NextElem(L,a,&b);
if(j==1)
{
printf("%d的后继元素是:%d\n",a,b);
}
if(j==0)
{
printf("此元素无后继元素\n");
}
break;
default:
exit(0);
break;
}
}
return 0;
}
//操作会引起线性表变化时,就需要用到SqList *L。没用引起变化时用SqList L
C语言实现数据结构顺序表的基本操作
于 2022-02-22 10:08:25 首次发布