顺序表
warning:
这篇文章距离上次修改已过424天,其中的内容可能已经有所变动。
c语言和c++混用,写的比较乱。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include"sqlist.h"
using namespace std;
#define MAXSIZE 128
#define LISTINCREMENT 10
#define error 0
#define ok 1
typedef struct {
int *elem;//存储空间首地址
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList; //定义结构体
SqList createlist() {
SqList* list=(SqList*)malloc(sizeof(SqList));
return *list;
}//创建顺序表
int initlist(SqList &L) {
L.elem=(int*)malloc(sizeof(int)*MAXSIZE);
if(!L.elem)
return error;//内存分配失败,存储空间不够
L.length=0;//初始化顺序表长度
L.listsize = MAXSIZE;//顺序表最大存储单元个数
return ok;//初始化顺序表成功
}//初始化顺序表
void printlist(SqList &L) {
for(int i; i<L.length; i++)
cout<<L.elem[i]<<" ";
cout<<endl;
}
int insertlist(SqList &L,int index,int value) {
if (index>L.listsize) {
printf("插入的下标位置超出顺序表长度");
return error;
}else if(index<0) {
printf("插入的下标位置为负数");
return error;
}else if(index<=L.length){
if(L.length == L.listsize) {
printf("顺序表已满,将申请更大的新内存空间替换原顺序表内存空间\n");
int* newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));//比原顺序表多10单位类型长度
if(!newbase)
return error;//内存分配失败,存储空间不够
L.elem=newbase;
L.listsize+=LISTINCREMENT;
for(int i=index; i<L.length; i++)//初始化新增空间元素
L.elem[i]=0;
}
for(int i=L.length; i>index; i--) //逆序移位
L.elem[i]=L.elem[i-1];//从插入位置开始,后面元素依次右移一位
L.elem[index]=value;//插入元素
L.length++;
}
return ok;
}//插入元素到顺序表
int removelist(SqList &L,int value) {
int index=-1;
for(int i=0; i<L.length; i++) { //根据需删除元素值查找其下标
if(L.elem[i]==value) {
index=i;
break;
}
}
if(index==-1) {
return error;
}
for(index; index<L.length-1; index++) //顺序移位
L.elem[index]=L.elem[index+1];//从删除位置开始,后面元素依次左移一位
L.length--;
return ok;
}//根据需删除元素值查找并删除
int removelist(SqList &L,int index,int &elem) {
if(index>=L.length)//下标超出当前顺序表长度
return error;
else if(index<0)//下标为负数
return error;
else {
for(int i=index; i<L.length-1; i++) //顺序移位
L.elem[i]=L.elem[i+1];//从删除位置开始,后面元素依次左移一位
L.length--;
return ok;
}
}//根据需删除元素下标查找并删除
void destroylist(SqList &L) {
free(L.elem); //释放存储空间
L.length = 0;
exit(0);
}//删除顺序表
int searchlistlen(SqList &L) {
return L.length;
}
int searchlist(SqList &L,int index,int &elem) {
if(index<L.length) {
cout<<L.elem[index]<<endl;
return ok;
} else
return error;
}
int searchlist(SqList &L,int value) {
for(int i; i<L.length; i++) {
if(L.elem[i]==value)
return ok;
}
return error;
}
void endsystem(SqList& L) {
destroylist(L);
exit(0);
}
void SqListMenu() {
cout<<"1.初始顺序表\n";
cout<<"2.输出顺序表\n";
cout<<"3.插入元素\n";
cout<<"4.根据下标删除元素\n";
cout<<"5.根据值删除元素\n";
cout<<"6.删除顺序表\n";
cout<<"7.返回顺序表长度\n";
cout<<"8.根据下标查询元素\n";
cout<<"9.根据值查询元素\n";
cout<<"0.退出程序\n";
}
int main() {
SqList L;
int elem;
bool flag=true;
while(flag) {
SqListMenu();
printf("请输入数字选择功能:");
int n;
cin>>n;
switch(n) {
case 1: {
if(initlist(L))
cout<<"成功初始化线性表"<<endl;
else
cout<<"初始化线性表失败"<<endl;
break;
}
case 2: {
printlist(L);
break;
}
case 3: {
int i,v;
cout<<"请输入要插入的元素位置和值:";
cin>>i>>v;
if(insertlist(L,i,v))
cout<<"插入完成"<<endl;
else
cout<<"插入失败"<<endl;
break;
}
case 4: {
int i;
cout<<"请输入要删除的元素下标:";
cin>>i;
if(removelist(L,i,elem))
cout<<"删除成功"<<endl;
else
cout<<"删除失败"<<endl;
break;
}
case 5: {
int v;
cout<<"请输入要删除的元素值:";
cin>>v;
if(removelist(L,v))
cout<<"删除成功"<<endl;
else
cout<<"删除失败"<<endl;
break;
}
case 6: {
destroylist(L);
break;
}
case 7: {
cout<<"顺序表长度为"<<searchlistlen(L)<<endl;
break;
}
case 8: {
int i;
cout<<"请输入要查询的元素下标:";
cin>>i;
if(searchlist(L,i,elem))
cout<<"查询成功"<<endl;
else
cout<<"查询失败"<<endl;
break;
}
case 9: {
int v;
cout<<"请输入要查询的元素值:";
cin>>v;
if(searchlist(L,v))
cout<<"查询成功"<<endl;
else
cout<<"查询失败"<<endl;
break;
}
case 0: {
flag=false;
endsystem(L);
}
}
printf("\n");
}
}
头文件代码(仅有声明函数并宏定义作用)
#ifdef SQLIST_H_
#define SQLIST_H_
#define MAXSIZE 128
#define LISTINCREMENT 10
typedef struct{
int *elem;//存储空间首地址
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;//定义结构体
SqList createlist();
int initlist(SqList &);
int insertlist(SqList &,int);
int removelist(SqList &,int,int &);
int removelist(SqList &,int);
void destroy(SqList &);
int searchlistlen(SqList &);
int searchlist(SqList &,int,int &);
void endsystem();
void endsystem();
void SqListMenu();
#endif
已修正原代码中顺序表relloc扩容时出现的多个错误(2023.7.6)
--------根据严蔚敏版数据结构编写
评论已关闭