这是老师布置的课本上的作业,欢迎大家一起来交流,很欢迎指点,大一第一次做这种事。我用的课本是浙大的数据结构,陈越和何钦铭出的书,第一篇是顺序表的代码:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define ERROR -1
#define NotFound 0
typedef int Position;
struct LNode {
int *date;
Position Last;
int MaxSize;
};
typedef struct LNode *PtrToLNode;
typedef PtrToLNode List;
void show();
List MakeEmpty(int MaxSize);
Position Find(List L, int X);
bool Insert(List L, int X, int i);
bool Delete(List L, int i);
Position BinarySearch(List L, int X);
void print(List L);
int main() {
int n = -1, k, X, i, c = 0, j = 0;
List L = (List) malloc(sizeof(struct LNode));
while (1) {
if (c == 1 || j == 0) {
show();
j = 1;
}
scanf("%d", &n);
//system("pause");
if (n > 6 || n < -1) {
printf("请输入合法数字!请选择菜单序号:");
continue;
}
switch (n) {
case 1: {
L = MakeEmpty(MAXSIZE);
if (L)
c = 1;
}
break;
case 2: {
if (1 == c) {
printf("请输入你要查找的数字:");
scanf("%d", &X);
k = Find(L, X);
if (k == ERROR)
printf("查找无效!重新查询\n");
else
printf("你查找的数字在第%d个位置上\n", k + 1);
} else {
printf("失败!您还未创建表。重新选择:");
}
}
break;
case 3: {
if (1 == c) {
printf("请输入你要插入的位置:");
scanf("%d", &i);
printf("请输入你要插入的数字:");
scanf("%d", &X);
k = Insert(L, X, i);
if (k)
printf("插入成功\n");
else
printf("插入失败\n");
} else {
printf("失败!您还未创建表。重新选择:");
}
}
break;
case 4: {
if (1 == c) {
printf("输入你要删除的位序号:");
scanf("%d", &i);
k = Delete(L, i);
if (k)
printf("删除成功!\n");
else
printf("删除失败,请输入合法序号或检查表容量");
} else {
printf("失败!您还未创建表。重新选择:");
}
}
break;
case 5: {
if (1 == c) {
printf("请输入需要查找的数字:");
scanf("%d", &X);
k = BinarySearch(L, X);
if (k)
printf("查找的数字在第%d位置上\n", k + 1);
else
printf("查找失败!\n");
} else {
printf("失败!您还未创建表。重新选择:");
}
}
break;
case 6:
if (1 == c) {
print(L);
} else {
printf("失败!您还未创建表。重新选择:");
}
break;
}
if (n == 0)
break;
}
}
// 创建顺序表
List MakeEmpty(int MaxSize) {
List L;
L = (List) malloc(sizeof(struct LNode));
L->date = (int *) malloc(MaxSize * sizeof(int));
L->Last = -1;
int i = 0, n, k = 0;
printf("输入一连串数字,中间用空格分开, 输入0退出:");
while (1) {
scanf("%d", &n);
if (n == 0)
break;
L->date[i] = n;
L->Last++;//让指向最后的那个指针指向最后的一个数据的位置
i++;
k = 1;
}
if (k == 1)
printf("创建成功\n\n");
else
printf("创建失败\n\n");
return L;
}
// 查找函数
Position Find(List L, int X) {
Position i = 0;
while (i < L->Last && L->date[i] != X)
i++;
if (i > L->Last)
return ERROR;
else
return i;
}
// 插入函数
bool Insert(List L, int X, int i) {
Position j;
if (L->Last == MAXSIZE - 1) {
printf("表满\n");
return false;
}
if (i < 1 || i > L->Last + 2) {
printf("位序不合法\n");
return false;
}
for (j = L->Last; j >= i - 1; j--)
L->date[j + 1] = L->date[j];
L->date[i - 1] = X;
L->Last++;
return true;
}
// 删除函数
bool Delete(List L, int i) {
Position j;
if (i < 1 || i > L->Last + 2) {
printf("位序%d不存在元素\n", i);
return false;
}
for (j = i; j <= L->Last; j++)
L->date[j - 1] = L->date[j];
L->Last--;
return true;
}
// 这里是二分查找法
Position BinarySearch(List L, int X) {
Position left, right, mid;
left = 0;
right = L->Last;
while (left <= right) {
mid = (left + right) / 2;
if (X < L->date[mid])
right = mid - 1;
else if (X > L->date[mid])
left = mid + 1;
else
return mid;
}
return NotFound;
}
void print(List L) {
int i;
printf("该序列为:");
if (L->Last == -1)
printf("序列空\n");
else
for (i = 0; i <= L->Last; i++)
printf("%d ", L->date[i]);
printf("\n");
}
void show() {
printf("\n");
printf(" *************顺序表*************\n");
printf(" * 1.输 入 数 字 *\n");
printf(" * 2.查 找 数 字 *\n");
printf(" * 3.插 入 数 字 *\n");
printf(" * 4.删 除 数 字 *\n");
printf(" * 5.二分法 查找 *\n");
printf(" * 6.查 询 显 示 *\n");
printf(" * 0.退 出 系 统 *\n");
printf(" ********************************\n");
printf("请选择菜单序号:");
}