mozibumozi 2021-09-19 19:50 采纳率: 37.5%
浏览 38
已结题

其他段程序可以编译出来 删除的编译不出来 想请问一下是代码哪里出了问题


#include <stdio.h>
#define MAXSIZE 100
typedef struct 
{ 
    int elem[MAXSIZE];
    int last;
 } SeqList;
 void PrinList(SeqList L)
 {    int i;
     for(i=0;i<=L.last;i++)
     printf("\n顺序表L元素%d为%d ",i+1,L.elem[i]);  
  }  
  int  Locate(SeqList L, int e)
{    
    int i=0;        /*i为扫描计数器,初值为0,即从第一个元素开始比较*/
    while ((i<=L.last)&&(L.elem[i]!=e))/*顺序扫描表,直到找到值为key的元素, 或扫描到表尾而没找到*/
        i++; 
    if  (i<=L.last)
        return(i+1);  /*若找到值为e的元素,则返回其序号*/
    else
        return(-1);  /*若没找到,则返回空序号*/
}
int  InsList(SeqList *L,int i,int e)
{ 
    int k;
    if((i<1) || (i>L->last+2)) /*首先判断插入位置是否合法*/
    {
        printf("插入位置i值不合法");
        return(-1);
    }
    if(L->last>= MAXSIZE-1)
    {
        printf("表已满无法插入");
        return(-1);
    }
    for(k=L->last;k>=i-1;k--)   /*为插入元素而移动位置*/
        L->elem[k+1]=L->elem[k];
    L->elem[i-1]=e;   /*在C语言数组中,第i个元素的下标为i-1*/
    L->last++;
    return(1);
}
 void prinList(SeqList L)
 {    int i;
     for(i=0;i<=L.last;i++)
     printf("\n顺序表L元素%d为%d ",i+1,L.elem[i]);  
  }
  int  DelList(SeqList *L,int i)
/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。i的合法取值为1≤i≤L.last+1 */    
{ 
    int k;
    if((i<1)||(i>L->last+1))   
    { 
        printf("删除位置不合法!");
        return(-1);
    }
    for(k=i; i<=L->last; k++)
        L->elem[k-1] = L->elem[k];  /*将后面的元素依次前移*/
    L->last--;
    return(1);
}
 void prinlist(SeqList L)
 {    int i;
     for(i=0;i<=L.last;i++)
     printf("\n顺序表L元素%d为%d ",i+1,L.elem[i]);  
  }
 int main()
 {  int i;
      SeqList L;
      int pos;
      scanf("%d ",&L.last);
    for(i=0;i<=L.last;i++)
        scanf("%d",&L.elem[i]);
        PrinList(L);
        printf("\n顺序表的长度为%d",L.last +1); 
        printf("\n顺序表的第%d个元素为%d",i=3,L.elem[2]); 
    pos=Locate(L,12);
    printf("\n12的位置为%d",pos);
    InsList(&L,4,999);
    prinList(L);
    DelList(&L,3);
    prinlist(L);
     return 0;
 }
 

img

img

  • 写回答

3条回答 默认 最新

  • 泡视界 2021-09-22 14:05
    关注
    1. 首先“其他段程序可以编译出来 删除的编译不出来” 这个描述应该是“其他段程序可以运行出来 删除后的结果打印不出来”。 编译和运行的概念要分别理解一下哈。
    2. 删除后的结果打印不出来的原因为:L->last为负数,因此走到prinList函数时,i=0;i<=L.last;i++ 这里不成立,因此不会走到循环里面,就不会打印。
    3. L->last为负数的原因为:DelList 函数中 for(k=i; i<=L->last; k++) 循环写错,应该为 for(k=i; k<=L->last; k++) ,否侧循环将持续运行直到L->last值被修改。
    4. structure中各个元素的内存是顺序排的,且其内存大小是最大的元素的内存的整数倍。此例中 SeqList结构体中 last 和elem 均为int型, last内存就排在 elem[99]的后面。由于上面所述第三点原因, L->elem[k - 1] = L->elem[k] 将一直持续下去,直到 L->elem[100] = L->elem[101],此时L->elem[100]就是L->last,L->elem[101]为未初始化的一个值,赋值后L->last为负数而 i == 3,i<=L->last不成立最终跳出循环。
    5. 题外话:这个写法不叫链表,这叫数组。
    6. 题外话:你写了两个打印函数 prinList 和PrinList
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月1日
  • 已采纳回答 9月23日
  • 创建了问题 9月19日

悬赏问题

  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥50 我撰写的python爬虫爬不了 要爬的网址有反爬机制
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等