#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;
}
}
}
uj5u.com熱心網友回復:
寫這么多回傳值的宏實際上完全可以靠回傳值帶出去,沒必要定義,只需要判斷其回傳值就行了uj5u.com熱心網友回復:
寫的挺好的,對新手是個不錯的練習專案。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/15843.html
標籤:模式及實現
