WMonkeyB 2023-03-06 23:01 采纳率: 100%
浏览 39
已结题

c语言顺序表功能有错误


#include<stdio.h>
#include<stdlib.h>
#define MAXLEN 100             //定义常量MAXLEN为10表示存储空间总量 
typedef int DataType;         //定义DataType为int类型 
typedef struct                //顺序表存储类型 
{    DataType data[MAXLEN];    //存放线性表的数组 
    int Length;                //Length 顺序表长度 
}Seqlist; 
void InitList(Seqlist *L)    
{      
    L->Length=0;            /*初始化顺序表为空*/ 
};
void CreateList(Seqlist *L,int n)        /*建立顺序表并输入多个元素函数*/
{    int i;
    printf("请输入和%d个整数:",n);
    for(i=0;i<n;i++)
        scanf("%d",&L->data[i]) ;
        L->Length=i;                         //设线性表的长度为i
}
int GetElem(Seqlist *L,int i,DataType *x)    //按顺序查找,,获取顺序表中第i位元素
{    if(i<1||i>L->Length)                    // 当查找位置i不正确时;
        return 0; 
    else
    {
        *x=L->data[i-1];                    //将顺序表中第i个元素赋给指针x 所指变量 
        return 1;
    }
}    
 int Locate(Seqlist *L,DataType x)            //按值查找,,在顺序表L中定位元素x函数 
 {    int i=0;
    while(i<L->Length&&L->data[i]!=x)
        i++;
    if(i>=L->Length)
        return 0;
    else
        return i+1; 
 }
 int InsElem(Seqlist *L,int i,DataType x)     //在顺序表中第i位插入元素x 
 {  int j;
     if(L->Length>=MAXLEN)
    {    printf("顺序表已满!");
        return -1; 
    }
    if(i<1||i>L->Length+1)
    {
        printf("插入位置出错!");
        return 0;
    }
    if(i==L->Length+1)                        //插入的位置为表尾,不需要移动直接插入 
    {    L->data[i-1]=x;
        L->Length++;
        return 1; 
    }
    for(j=L->Length-1;j>=i-1;j--)            //插入表中某位置,插入点后各结点向后移 
    {    L->data[j+1]=L->data[j];            
        L->data[i-1]=x;                        //插入元素x 
        L->Length++;                        //顺序表长度+1 
        return 1; 
    }
}
    int DelElem(Seqlist *L,int i,DataType *x) //在顺序表中删除第i位元素 
    {    int j;
        if(L->Length==0)
        {
           printf("顺序表为空!");
           return 0; 
        }
        if(i<1||i>L->Length)  
        {
            printf("不存在第i个元素");
            return 0;    
        } 
        *x=L->data[i-1];
        for(j=i;j<L->Length;j++)
        {
            L->data[j-1]=L->data[j];
            L->Length--;
            return 1;
        }
    } 
    void DispList(Seqlist *L)//显示输出顺序表L中的每一个元素函数 
    {
        int i;
        for(i=0;i<L->Length;i++)
        {
            printf("%5d",L->data[i]);
        }
    }
    void Menu()
    {
        printf("\n                顺序表的各种操作");
        printf("\n================================================================"); 
        printf("\n                1------建立顺序表");
        printf("\n                2------插入元素    ");
        printf("\n                3------删除元素") ;
        printf("\n                4------按位置查找元素");
        printf("\n                5------按元素值查找其在其中的位置");
        printf("\n                6------求顺序表的长度");
        printf("\n                0-------返回");
        printf("\n=================================================================");
        printf("\n 请输入菜单号(0~6)");
    }
    void main()
    
    {
        Seqlist     L;
        DataType    x;
        int n,i,loc;
        char ch1,ch2,a;
        ch1='y';
        while(ch1=='y'||ch1=='Y')
        {
            Menu();
            scanf("%c",&ch2);
            getchar();
            switch(ch2)
            {
                case '1':
                    InitList(&L) ;
                    printf("将输入建立线性表的个数");
                    scanf("%d",&n);
                    CreateList(&L,n);
                    printf("建立的线性表为:");
                    DispList(&L);
                    break;
                case '2':
                    printf("请输入要插入的位置");
                    scanf("%d",&i);
                    printf("请上输入要插入的元素值:");
                    scanf("%d",&x);
                    if(InsElem(&L,i,x))
                    {
                        printf("已成功在%d的位置上插入%d,插入后的线性表为:\n",i,x);
                        DispList(&L);
                     } 
                     else
                         printf("输入插入的参数错误!");
                     break;
                case'3':
                    printf("请输入删除元素的位置");
                    scanf("%d",&i);
                    if(DelElem(&L,i,&x))
                    {                    
                        printf("已成功在%d的位置上删除%d,删除后的线性表为:\n",i,x);
                        DispList(&L);
                    }
                    else
                        printf("输入删除的参数错误");
                    break;
                case'4':
                    printf("请输入要查看表中元素位置(从1开始)");
                    scanf("%d",&i);
                    if(GetElem(&L,i,&x))
                        printf("当前线性表第%d的位置为:%d",i,x);
                    else
                        printf("输入的位置错误");
                    break; 
                case'5':
                    printf("请输入要查找的元素值为:");
                    scanf("%d",&x);
                    loc=Locate(&L,x);
                    if(loc)
                        printf("查找元素为%d的位置为:%d",x,loc);
                    else
                        printf("该表中无此元素!");
                    break;     
                case'6': 
                        printf("当前线性表的长度为:%d",L.Length);
                    break;
                case'0':
                    ch1='n';
                    break;
                default:
                    printf("输入有误,请输入0~6进行选择");
            } 
            if(ch2!='0')
            {
                printf("\n按回车键继续,按任意键返回主菜单!\n");
                    a=getchar();
                    if(a!='\xA')
                    {
                        getchar();
                        ch1='n'; 
                    }
            }
        }
    }

求代佬指点 代码如上 使用插入和删除功能时出现 如图的错误 看书上自己调试的找不出问题

img

img

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2023-03-07 10:24
    关注

    修改完善如下,供参考:

    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>      // 修改
    #define MAXLEN 100             //定义常量MAXLEN为10表示存储空间总量 
    typedef int DataType;         //定义DataType为int类型 
    typedef struct                //顺序表存储类型 
    {
        DataType data[MAXLEN];    //存放线性表的数组 
        int Length;                //Length 顺序表长度 
    }Seqlist;
    void InitList(Seqlist* L)
    {
        L->Length = 0;            /*初始化顺序表为空*/
    };
    void CreateList(Seqlist* L, int n)        /*建立顺序表并输入多个元素函数*/
    {
        int i;
        printf("请输入和%d个整数:", n);
        for (i = 0; i < n; i++)
            scanf("%d", &L->data[i]);
        L->Length = i;                         //设线性表的长度为i
    }
    int GetElem(Seqlist* L, int i, DataType* x)    //按顺序查找,,获取顺序表中第i位元素
    {
        if (i<1 || i>L->Length)        //当查找位置i不正确时;
            return 0;
        else
        {
            *x = L->data[i - 1];                    //将顺序表中第i个元素赋给指针x 所指变量 
            return 1;
        }
    }
    int Locate(Seqlist* L, DataType x)            //按值查找,,在顺序表L中定位元素x函数 
    {
        int i = 0;
        while (i < L->Length && L->data[i] != x)
            i++;
        if (i >= L->Length)
            return 0;
        else
            return i + 1;
    }
    int InsElem(Seqlist* L, int i, DataType x)     //在顺序表中第i位插入元素x 
    {
        int j;
        if (L->Length >= MAXLEN)
        {
            printf("顺序表已满!");
            return -1;
        }
        if (i < 1 || i > L->Length + 1)
        {
            printf("插入位置出错!");
            return 0;
        }
        if (i == L->Length + 1)                        //插入的位置为表尾,不需要移动直接插入 
        {
            L->data[i - 1] = x;
            L->Length++;
            return 1;
        }
        for (j = L->Length - 1; j >= i - 1; j--)            //插入表中某位置,插入点后各结点向后移 
        {
            L->data[j + 1] = L->data[j];
        }  //修改
        L->data[i - 1] = x; //插入元素x    修改
        L->Length++;       //顺序表长度+1  修改
        return 1;
        //}
    }
    int DelElem(Seqlist* L, int i, DataType* x) //在顺序表中删除第i位元素 
    {
        int j;
        if (L->Length == 0)
        {
            printf("顺序表为空!");
            return 0;
        }
        if (i<1 || i>L->Length)
        {
            printf("不存在第%d个元素", i);  //修改
            return 0;
        }
        *x = L->data[i - 1];
        for (j = i; j < L->Length; j++)
        {
            L->data[j - 1] = L->data[j];
        } //修改
        L->Length--; //修改
        return 1;    //修改
        //}
    }
    void DispList(Seqlist* L)//显示输出顺序表L中的每一个元素函数 
    {
        int i;
        for (i = 0; i < L->Length; i++)
        {
            printf("%5d", L->data[i]);
        }
    }
    void Menu()
    {
        printf("\n                顺序表的各种操作");
        printf("\n================================================================");
        printf("\n                1------建立顺序表");
        printf("\n                2------插入元素    ");
        printf("\n                3------删除元素");
        printf("\n                4------按位置查找元素");
        printf("\n                5------按元素值查找其在其中的位置");
        printf("\n                6------求顺序表的长度");
        printf("\n                0-------返回");
        printf("\n=================================================================");
        printf("\n 请输入菜单号(0~6)");
    }
    void main()
    
    {
        Seqlist     L;
        DataType    x;
        int n, i, loc;
        char ch1, ch2, a;
        ch1 = 'y';
        InitList(&L);                     //修改
        while (ch1 == 'y' || ch1 == 'Y')
        {
            Menu();
            scanf(" %c", &ch2);
            getchar();
            switch (ch2)
            {
            case '1':
                //InitList(&L);         //修改
                printf("将输入建立线性表的个数");
                scanf("%d", &n);
                CreateList(&L, n);
                printf("建立的线性表为:");
                DispList(&L);
                break;
            case '2':
                printf("请输入要插入的位置");
                scanf("%d", &i);
                printf("请上输入要插入的元素值:");
                scanf("%d", &x);
                if (InsElem(&L, i, x))
                {
                    printf("已成功在%d的位置上插入%d,插入后的线性表为:\n", i, x);
                    DispList(&L);
                }
                else
                    printf("输入插入的参数错误!");
                break;
            case'3':
                printf("请输入删除元素的位置");
                scanf("%d", &i);
                if (DelElem(&L, i, &x))
                {
                    printf("已成功在%d的位置上删除%d,删除后的线性表为:\n", i, x);
                    DispList(&L);
                }
                else
                    printf("输入删除的参数错误");
                break;
            case'4':
                printf("请输入要查看表中元素位置(从1开始)");
                scanf("%d", &i);
                if (GetElem(&L, i, &x))
                    printf("当前线性表第%d的位置为:%d", i, x);
                else
                    printf("输入的位置错误");
                break;
            case'5':
                printf("请输入要查找的元素值为:");
                scanf("%d", &x);
                loc = Locate(&L, x);
                if (loc)
                    printf("查找元素为%d的位置为:%d", x, loc);
                else
                    printf("该表中无此元素!");
                break;
            case'6':
                printf("当前线性表的长度为:%d", L.Length);
                break;
            case'0':
                ch1 = 'n';
                break;
            default:
                printf("输入有误,请输入0~6进行选择");
            }
            if (ch2 != '0')      //修改
            {
                printf("\n按任意键返回主菜单!\n");
                _getch();          //修改
                //a = getchar();   //修改
                //if (a != '\xA')
                //{
                //    getchar();
                //    ch1 = 'n';
                //}
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 已采纳回答 3月7日
  • 创建了问题 3月6日

悬赏问题

  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系