GhostSheep9 2022-03-24 16:17 采纳率: 33.3%
浏览 43

c语言数据结构顺序表问题,自学初学者求解

问题遇到的现象和发生背景

建立一个非空的值域为整数的顺序表,从键盘输入一个整数item,编程实现删除表中所有值为item的数据元素。
(1) 建立长度至少为10的顺序表;
(2) 从键盘输入一个整数item,删除表中所有与item相同的元素,删除成功显示“OK”,不成功显示“ERROR”。
(3) 显示顺序表的内容;
(4) 要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。

问题相关代码,请勿粘贴截图
#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #define ERROR 0
 #define OK 1
 #define FALSE -1
 #define TRUE 1
 #define MAX 100
typedef struct Sq {
    int elem[MAX] ;
    int length ; //长度;
} List;

int menu_select();    //菜单驱动程序
int InitList(List *L); //初始化顺序表
void TraveList(List L); //显示顺序表
void CreateList(List *L); //创建顺序表
void Delete(List *L  , int  item); //删除元素

// 选择输出的内容;
int menu_select()    //菜单驱动程序
{
    int sn;
    printf("实验一运行系统\n");        //显示菜单
    printf("==============================\n");
    printf("1、顺序表的建立\n");
    printf("2、顺序表的删除\n");
    printf("3、顺序表的输出\n");
    printf("0、退出实验一运行系统\n");
    printf("==============================\n");
    printf("请选择0--3:");

    for ( ; ; )        //菜单功能选择
            {
          scanf("%d", &sn);
          getchar();  //吃掉回车;
        if (sn < 0 || sn > 3)
            printf("\n输入选择错误,请重新选择 0--3:");
        else
            break;
            }
    return sn; //返回命令;
}

int InitList(List *L) { //初始化顺序表;
    L->length = 0;  //初始化长度;
    return 1;  // ???
}

/*
 TODO: 输出顺序表的内容
 功能:输出顺序表的内容,每个元素之间用空格隔开,顺序表为1 2 3 4
 5 6
 则输出:1 2 3 4 5 6 输出完成后进行换行。
 参数:List L 是需要操作的顺序表
 返回值:无
 */
void TraveList(List L) {  // 传值的方式输入;
         int i=0;
            while(i!=L.length)
                {
                     printf ( "%d "  , L.elem[i] );
                     i++;
                }
                printf("\n");
}
/*
 TODO: 创建顺序表
 功能:提示("请输入元素值:"),建立长度至少为10,元素均为int型的顺序表;
 创建顺序表按0 + 回车,完成创建,如输入: 1 2 3 4 5 6 0 回车
 则生成顺序表:1 2 3 4 5 6
 参数:List *L 是需要操作的单链表
 返回值:无。
 */
void CreateList(List *L) { // 传入地址的方式 ;

    int loop = 1;
    int i = 0;
    int e;
    printf("请输入元素值:");
    while(scanf("%d",&e),e|| i<10   ) {
             L->elem[i]=e;
                 printf(" L->elem[i]=%d\n",L->elem[i]);
             i++;  // 加完了之后再判段,就是 真实的值;
    }
         L->length=i;
}

/*
 TODO: 删除表中与Item值相同的元素
 功能:从键盘输入一个整数item,删除表中与Item数字相同的元素
 比如:表为:6 5 4 3 2 1,录入2,则删除2,新的顺序表为:6 5 4 3 1 // 顺序不变;
 参数:List *L 是需要操作的表,item是指定删除元素的数值
 返回值:空
 */
void Delete(List *L , int item) {

    int *p1, *p2;
    int len = L->length;

    p1 = &L->elem[0];   // p1 指向数组开头
    for (p2 = p1; p2 < (L->elem + len); p2++) {     // 用p2遍历整个数组
        if (*p2 != item) {      // 检查数据合法
             *p1++ = *p2;        // 将合法数据搬运到p1,并且p1移位,准备下次接收
         } else {
            L->length--;        // 舍弃不合法的数据,并将数组长度减短
        }
    }
    if(L->length==len)
      printf("ERROR");
     else
       printf("OK");

}

void main() {
    List L;
    int item;
    for (;;) {
        switch (menu_select()) {  //选择进行得序号;
        case 1:

            InitList(&L);
            CreateList(&L);
            break;
        case 2:
            printf("顺序表的删除\n");
            printf("请输入要删除的标的元素item:");

            scanf("%d", &item);
            Delete(&L, item);
            break;
        case 3:
            printf("顺序表的输出\n");
            TraveList(L);
            break;
        case 0:
            printf("再见!\n");
            return;
        }
    }
}


运行结果及报错内容

运行显示时间超时

我的解答思路和尝试过的方法

我尝试修改遍历、创造、删除列表都无济于事,不知道有什么办法

我想要达到的结果

通过对函数的修改优化,使程序能完美运行就好了。谢谢各位

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2022-03-24 16:25
    关注

    具体说一下你执行了哪些步骤,到哪一步出现超时的,你输入信息截图看看,这样可以调试一下

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月24日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。