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);
    }
  • 相关阅读:
    多浏览器CSS样式解决方法
    CSS基础
    HTML页面——常用模块
    CSS选择器
    li水平与div水平
    天梯题目解答——1012、1430
    天梯题目解答——1205、1075、1083、1160
    HTML5 元素拖动
    div简单水平移动效果
    Matlab代码优化--向量化
  • 原文地址:https://www.cnblogs.com/rain-1/p/4851269.html
Copyright © 2011-2022 走看看