C语言数据结构动态顺序表,希望各位给点建议。

Y0220Y 2020-06-01 03:40:58
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable : 4996)

typedef struct SqList
{
int* elem;
int length;
int size = 5;
}SqList;

//***************************基本操作*****************************//

bool Init_SqList(SqList& L)
{
L.elem = (int*)malloc(L.size * sizeof(int));
if (!L.elem)
return false;
else
L.length = 0;
return true;
}

int Creat_SqList(SqList& L, int len)
{
if (len > 100)
return 10;

if (len > L.size)
{
L.size = len;
L.elem = (int*)realloc(L.elem, L.size * sizeof(int));
}

printf("请依次输入%d个表数据:", len);
for (int i = 0; i < len; i++)
{
scanf("%d", &L.elem[i]);
L.length++;
}
}

int Insert_SqList(SqList& L, int add, int num)
{
if (add<1 || add>L.length + 1) //插入位置错误
return 10;
if (L.length == L.size)
{
if (L.size == 100)
return 20; //总长度已满
else
L.size++;
L.elem = (int*)realloc(L.elem, L.size * sizeof(int));
}

for (int i = L.length - 1; i >= add - 1; i--)
{
L.elem[i + 1] = L.elem[i];
}
L.elem[add - 1] = num;
L.length++;
return 1;
}

int Delete_SqList(SqList& L, int add)
{
if (add<1 || add>L.length) //删除位置错误
return 10;

printf("请问您确认删除吗?确认请按1,否认请按0:");
int a; scanf("%d", &a);
printf("\n");
if (a == 0)
return 0; //退出删除

for (int i = add; i < L.length - 1; i++)
{
L.elem[i - 1] = L.elem[i];
}
L.length--;
return 1;
}

int Get_SqList(SqList& L, int add)
{
if (add >= 1 & add <= L.length)
return L.elem[add - 1];

else
return 0;
}

int Find_SqList(SqList& L, int num)
{
for (int i = 0; i < L.length; i++)
{
if (L.elem[i] == num)
return i + 1;
}

return 0;
}

//***************************应用操作*****************************//

void Print(SqList& L)
{
for (int i = 0; i < L.length; i++)
printf("第%d个元素:%d\n", i + 1, L.elem[i]);
}

void Create(SqList& L)
{
int len, flag;
printf("请输入顺序表的长度:");
scanf("%d", &len);
flag = Creat_SqList(L, len);
if (flag == 01)
printf("!!!长度错误!!!\n");
Print(L);
printf("\n");
}

void Insert(SqList& L)
{
int add, num, flag;
printf("请输入你要插入的位置:");
scanf("%d", &add);
printf("请输入你要插入的数据:");
scanf("%d", &num);

flag = Insert_SqList(L, add, num);
switch (flag)
{
case 10:printf("!!!插入位置错误!!!\n"); break;
case 20:printf("!!!储存空间已满!!!\n"); break;
case 1:printf("***插入成功***\n"); break;
}
Print(L);
printf("\n");
}

void Delete(SqList& L)
{
int add, flag;
printf("请输入你要删除的位置:");
scanf("%d", &add);
printf("\n");

flag = Delete_SqList(L, add);
switch (flag)
{
case 10:printf("!!!删除位置错误!!!\n"); break;
case 0:printf("***删除已终止***\n"); break;
case 1:printf("***删除成功***\n"); break;
}
if (flag == 1)
Print(L);
printf("\n");
}

void Find(SqList& L)
{
int num, flag;
printf("请输入你要查找的值:");
scanf("%d", &num);
flag = Find_SqList(L, num);
switch (flag)
{
case 0:printf("!!!没找着!!!"); break;
default:printf("%d在%d的位置上", num, flag); break;
}
}

void Get(SqList& L)
{
int add, flag;
printf("请输入你要查找的位置:");
scanf("%d", &add);
flag = Get_SqList(L, add);
switch (flag)
{
case 0:printf("!!!没找着!!!"); break;
default:printf("%d的位置上的值为%d", add, flag); break;
}
}

void menu()
{
printf("********1.创建 2.插入*********\n");
printf("********3.删除 4.查找*********\n");
printf("********5.取值 6.输出*********\n");
printf("********7. 8.退出*********\n");
}


int main()
{
SqList L;
bool flag;
int count = 0;
A:flag = Init_SqList(L);
if (flag == true)
printf("***顺序表初始化成功***\n");
else
{
printf("!!!顺序表初始化失败\n!!!");
count++;
if (count == 3)
{
printf("!!!玩不了,老失败!!!");
return 0;
}
else
goto A;
}

while (1)
{
menu();
char a;
printf("请输入你的选择:");
scanf("%d", &a);
printf("\n");
switch (a)
{
case 1:Create(L); break;
case 2:Insert(L); break;
case 3:Delete(L); break;
case 4:Find(L); break;
case 5:Get(L); break;
case 6:Print(L); break;
}
if (a == 8)
{
free(L.elem);
printf("退出成功");
return 0;
}
}
}
...全文
207 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
靠墙数硬币 2020-08-18
  • 打赏
  • 举报
回复
写的挺好的,对新手是个不错的练习项目。
依旧野指针 2020-07-24
  • 打赏
  • 举报
回复
写这么多返回值的宏实际上完全可以靠返回值带出去,没必要定义,只需要判断其返回值就行了

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧