c语言顺序表功能有错误


#include
#include
#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"%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(iLength&&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;jLength;j++)
        {
            L->data[j-1]=L->data[j];
            L->Length--;
            return 1;
        }
    } 
    void DispList(Seqlist *L)//显示输出顺序表L中的每一个元素函数 
    {
        int i;
        for(i=0;iLength;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

修改完善如下,供参考:

#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';
            //}
        }
    }
}

59、79行的return 1你不能放到for循环里啊。要放到循环结束以后,否则循环只执行了一次就结束了,结果当然不对了

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^