顺序表(数据结构)

这是老师布置的课本上的作业,欢迎大家一起来交流,很欢迎指点,大一第一次做这种事。我用的课本是浙大的数据结构,陈越和何钦铭出的书,第一篇是顺序表的代码:

#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("请选择菜单序号:");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值