zoukankan      html  css  js  c++  java
  • 我的线性表(顺序表)

    啦啦啦……写了将近一上午,功能不太全,只写了老师要求写的功能,待会儿我把其他功能补充下再粘贴一个

    这个只有1:定义线性表,2:初始化线性表,3:删除第i个位置的元素,4:删除值为e的元素,5:查找第i个位置上的元素,6:打印顺序表 7:销毁顺序表

    #include <stdio.h>
    #include <malloc.h>
    #define LISTINCREMENT 10
    typedef struct
    {
        int *elem;
        int length;
        int listsize;
    }SqList;
    
    void printMenu();//打印功能选择菜单
    bool initListSq(SqList &L, int len); //初始化线性表,成功则返回1,失败返回0
    bool listInsertSq(SqList &L, int i, int e);//在线性表的第i个位置插入元素e
    bool listDataDeleteSq(SqList &L, int &i, int e); //删除顺序表中元素e,并返回它的位置i
    bool listLocationDeleteSq(SqList &L, int i, int &e);//删除顺序表中第i个位置的元素,并返回元素的值e
    bool locateElemSq(SqList &L, int &i, int e);//查找某个元素,找到则返回它的位置,否则返回0
    void listPrintSq(SqList &L); //打印该线性表
    void destorySq(SqList &L); //销毁该线性表
    
    void printMenu()
    {
        printf("  请选择对该线性表的操作:
    ");
        printf("1:插入一个元素
    ");
        printf("2:删除顺序表中第i个元素,并输出它的值e
    ");
        printf("3:删除顺序表中的元素e,并输出其位置
    ");
        printf("4:查找某个元素,找到则输出它的位置,否则输出0
    ");
        printf("5:打印该顺序表
    ");
        printf("6:销毁该顺序表
    ");
        printf("q:退出程序
    ");
    }
    int main()
    {
        int len, quik = 0;
        SqList La;
        char choice;
        printf("请输入建立的顺序表的元素个数:");
        scanf("%d", &len);
        initListSq(La, len);
        for(;;) //用户在选择退出之前可以根据菜单随意对线性表进行操作;
        {
            int i, e;
            bool check;
            printMenu();
            getchar();
            scanf("%c", &choice);
            switch(choice)
            {
            case '1':
                printf("请输入要插入的元素位置和元素的值:(1 <= i <= %d)", La.length+1);
                scanf("%d%d", &i, &e);
                check = listInsertSq(La, i, e);
                if(check)
                    printf("插入成功!
    ");
                else
                    printf("插入失败!(请检查输入的位置是否在合法范围)
    ");
                break;
            case '2':
                printf("请输入要删除的元素的位置:");
                scanf("%d", &i);
                check = listLocationDeleteSq(La, i, e);
                if(check)
                    printf("删除成功!
    ");
                else
                    printf("删除失败!(请检查输入的位置的范围或者该表是否为空)
    ");
                break;
            case '3':
                printf("请输入要删除的元素的值:");
                scanf("%d", &e);
                check = listDataDeleteSq(La, i, e);
                if(check == 1)
                    printf("删除成功!
    ");
                else
                    printf("删除失败!(请检查您输入的值是否存在于线性表中)");
                break;
            case '4':
                printf("请输入要查找的元素:");
                scanf("%d", &e);
                check = locateElemSq(La, i, e);
                if(check)
                    printf("找到了,该元素在线性表中的第%d个位置上
    ", i);
                else
                    printf("sorry, 没找到哎,要不您再检查一下输入的元素是否是线性表中的元素?");
            case '5':
                listPrintSq(La);
                break;
            case '6':
                    destorySq(La);
                    printf("销毁完成!
    ");
            case 'q':
                quik = 1;break;
            default:
                printf("您输入的数字不在范围内,请重新输入
    ");
            }
            if(quik)
            {
                printf("感谢您的使用,再见
    ");
                break;
            }
        }
        return 0;
    }
    
    bool initListSq(SqList &L, int len) //构造一个空的线性表,成功则返回1,失败返回0
    {
        L.elem = (int *)malloc(len*sizeof(int));
        if(!L.elem) exit(0);
        L.length = 0;
        L.listsize = len;
        return 1;
    }
    bool listInsertSq(SqList &L, int i, int e)
    {
        //在顺序线性表中第i个位置插入新的元素e
        //i的范围 1 <= i <= L.listsize + 1
        if(i < 1 || i > L.length+1) return 0;
        if(L.length >= L.listsize)
        {
            int *newbase = (int *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(int));
            if(!newbase) exit(0); //存储分配失败
            L.elem = newbase;
            L.listsize += LISTINCREMENT;
        }
        int *q = &(L.elem[i-1]), *p;
        for(p = &(L.elem[L.length-1]); p >= q; p--) *(p+1) = *p;
        *q = e;
        ++L.length;
        return 1;
    }
    bool listLocationDeleteSq(SqList &L, int i, int &e)//删除顺序表中第i个位置上的元素,并用e返回其值
    {
        //i的范围:1 <= i <= L.listsize;
        if(L.length == 0) return 0;
        if(i < 1 || i > L.listsize) return 0;
        int *p = &(L.elem[i-1]), *q;
        e = *p;
        q = L.elem + L.listsize;
        for(p++; p < q; p++) *(p-1) = *p;
        --L.length;
        return 1;
    }
    bool locateElemSq(SqList &L, int &i, int e)//查找某个元素,找到则返回它的位置,否则返回0
    {
        if(L.length == 0) return 0;
        i = 1;
        while(i <= L.length && L.elem[i-1] != e) ++i;
        if(i <= L.length) return 1;
        else return 0;
    }
    bool listDataDeleteSq(SqList &L, int &i, int e)//删除顺序表中值为e的元素,并用i返回它的位置
    {
        if(L.length == 0) return 0;
        int i1;
        bool flag;
        flag = locateElemSq(L, i1, e);
        if(flag)
        {
            listLocationDeleteSq(L, i1, e);
            return 1;
        }
        else
            return 0;
    }
    
    void listPrintSq(SqList &L) //打印该线性表
    {
        if(L.length == 0) {printf("该顺序表为空
    "); return ;}
        printf("该顺序表如下:
    ");
        for(int i = 0; i < L.length; i++)
        {
            printf("%d ", L.elem[i]);
            if(i != 0 && i % 6 == 0)
                printf("
    ");
        }
        printf("
    ");
    }
    void destorySq(SqList &L) //销毁该线性表
    {
        free(L.elem);
    }
  • 相关阅读:
    LeetCode 461. Hamming Distance
    LeetCode 442. Find All Duplicates in an Array
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode Find the Difference
    LeetCode 415. Add Strings
    LeetCode 445. Add Two Numbers II
    LeetCode 438. Find All Anagrams in a String
    LeetCode 463. Island Perimeter
    LeetCode 362. Design Hit Counter
    LeetCode 359. Logger Rate Limiter
  • 原文地址:https://www.cnblogs.com/rain-1/p/4851269.html
Copyright © 2011-2022 走看看