鱼C论坛

 找回密码
 立即注册
查看: 445|回复: 2

数据结构顺序表问题

[复制链接]
发表于 2023-9-20 21:57:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>;
  2. #include <stdlib.h>;
  3. #define maxsize 100
  4. #define ok 1
  5. typedef int elemtype;
  6. typedef struct {
  7.         elemtype *elem;
  8.         int length;
  9.         int initsize;
  10. }sqlist;
  11. void initlist(sqlist *L)
  12. {
  13.         int n;
  14.         printf("请输入你想创建的顺序表长度:\n");
  15.         scanf("%d",&n);
  16.         L->elem=(elemtype *)malloc(sizeof(elemtype)*n);
  17.         L->length=0;
  18.         L->initsize=maxsize;
  19.         printf("请输入顺序表里的数值:\n");
  20.         for(int i=0;i<n;i++)
  21.         {
  22.                 scanf("%d",&L->elem[i]);
  23.                 L->length++;
  24.         }
  25.         printf("顺序表创建成功\n");

  26. }
  27. void DisplayList(sqlist *L)
  28. {
  29.         int i;
  30.         for(i=0;i<L->length;i++)
  31.         {
  32.                 printf("%d ",L->elem[i]);
  33.         }

  34. }
  35. void listinsert(sqlist *L,int i,elemtype e)
  36. {
  37.         int *p,*q;
  38.         printf("请输入你要插入的数字\n");
  39.         scanf("%d",&e);
  40.         printf("请输入你要插入的位置\n");
  41.         scanf("%d",&i);
  42.         q=&(L->elem[i-1]);
  43.         if(i<1||i>L->length)
  44.         {
  45.                 printf("error!");
  46.         }
  47.         else
  48.         {
  49.                 for(p=&(L->elem[L->length-1]);p>=q-1;p--){
  50.                     *(p+1)=*p;
  51.                         }
  52.                         *q=e;
  53.                         L->length++;
  54.                
  55.                
  56.         }printf("插入成功\n");
  57. }
  58. void listdelete(sqlist *L,int i,elemtype e)
  59. {
  60.         printf("\n请输入你要删除第几位数:\n");
  61.         scanf("%d",&i);
  62.         if(i<1||i>L->length)
  63.         {
  64.                 printf("error!");
  65.         }
  66.         else
  67.         {
  68.                 for(i;i<=L->length;i++){
  69.                         L->elem[i-1]=L->elem[i];
  70.                 }
  71.                 L->length--;
  72.         }
  73. }
  74. void search(sqlist *L)
  75. {
  76.         int e,i,k=0;
  77.         printf("\n请输入你想要查找的数字:");
  78.         scanf("%d",&e);
  79.                 for(i=0;i<=L->length-1;i++){
  80.                         if(e==L->elem[i])
  81.                         {
  82.                                 k=1;
  83.                                 break;
  84.                         }
  85.                 }
  86.                 if(k==1)
  87.                 {
  88.                         printf("\n查找成功,位于第%d位\n",i+1);
  89.                 }
  90.                 else
  91.                 {
  92.                         printf("\n查找失败!\n");
  93.                 }
  94.        
  95. }
  96. void shanchuduoyu(sqlist *L)
  97. {
  98.        
  99. }
  100. int main()
  101. {
  102.         sqlist L;
  103.         int i,e;
  104.         initlist(&L);
  105.         listinsert(&L,i,e);
  106.         DisplayList(&L);
  107.         listdelete(&L,i,e);
  108.         printf("删除后表中数为:");
  109.         DisplayList(&L);
  110.         search(&L);
  111.         shanchuduoyu(&L);
  112.         DisplayList(&L);
  113.         return 0;
  114. }
复制代码

实验要求

(1)根据输入顺序表的长度n和n个无序整数值建立一个顺序表;

(2)在顺序表的第i个元素之前插入一个值为x的元素,并输出插入后的顺序表中各元素值;

(3)删除顺序表中第i个元素,并输出删除后的顺序表中各元素值;

(4)在顺序表中查找值为e的数据元素,如果查找成功,则输出“查找成功!”和该元素在顺序表中的位置,否则输出“查找失败!”;

(5)根据输入顺序表的长度m和m个非递减的有序整数建立一个有序顺序表,然后删除其中所有的重复元素(即相同的整数只保留一个) ,最后输出删除后的有序顺序表中各元素值。

前四题已完成,请帮我看看哪有错的吗,还有第五题不会写。写在shanchuduoyu那里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-20 21:57:34 | 显示全部楼层
代码中存在一些问题,具体如下:



1. 在listinsert函数中,已经定义了参数i和e,不需要再次输入,应该直接使用。



2. 在listdelete函数中,应该先判断删除的位置是否合法,否则会出现数组越界的问题。



3. 在search函数中,应该先判断顺序表是否为空,否则会出现数组越界的问题。



4. 在shanchuduoyu函数中,应该先判断顺序表是否为空,否则会出现数组越界的问题。



5. 在shanchuduoyu函数中,应该先判断顺序表是否有重复元素,否则会出现删除错误的问题。



下面是修改后的代码:



  1. #include <stdio.h>

  2. #include <stdlib.h>



  3. #define maxsize 100

  4. #define ok 1



  5. typedef int elemtype;



  6. typedef struct {

  7.     elemtype *elem;

  8.     int length;

  9.     int initsize;

  10. } sqlist;



  11. void initlist(sqlist *L)

  12. {

  13.     int n;

  14.     printf("请输入你想创建的顺序表长度:\n");

  15.     scanf("%d", &n);

  16.     L->elem = (elemtype *) malloc(sizeof(elemtype) * n);

  17.     L->length = 0;

  18.     L->initsize = maxsize;

  19.     printf("请输入顺序表里的数值:\n");

  20.     for (int i = 0; i < n; i++) {

  21.         scanf("%d", &L->elem[ i]);

  22.         L->length++;

  23.     }

  24.     printf("顺序表创建成功\n");

  25. }



  26. void DisplayList(sqlist *L)

  27. {

  28.     for (int i = 0; i < L->length; i++) {

  29.         printf("%d ", L->elem[ i]);

  30.     }

  31.     printf("\n");

  32. }



  33. void listinsert(sqlist *L, int i, elemtype e)

  34. {

  35.     printf("请输入你要插入的数字:\n");

  36.     scanf("%d", &e);

  37.     printf("请输入你要插入的位置:\n");

  38.     scanf("%d", &i);

  39.     if (i < 1 || i > L->length + 1) {

  40.         printf("error!\n");

  41.         return;

  42.     }

  43.     elemtype *p = &(L->elem[L->length - 1]);

  44.     elemtype *q = &(L->elem[i - 1]);

  45.     while (p >= q) {

  46.         *(p + 1) = *p;

  47.         p--;

  48.     }

  49.     *q = e;

  50.     L->length++;

  51.     printf("插入成功\n");

  52.     DisplayList(L);

  53. }



  54. void listdelete(sqlist *L, int i, elemtype e)

  55. {

  56.     printf("请输入你要删除第几位数:\n");

  57.     scanf("%d", &i);

  58.     if (i < 1 || i > L->length) {

  59.         printf("error!\n");

  60.         return;

  61.     }

  62.     elemtype *p = &(L->elem[i - 1]);

  63.     while (p < &(L->elem[L->length - 1])) {

  64.         *p = *(p + 1);

  65.         p++;

  66.     }

  67.     L->length--;

  68.     printf("删除成功\n");

  69.     DisplayList(L);

  70. }



  71. void search(sqlist *L)

  72. {

  73.     if (L->length == 0) {

  74.         printf("顺序表为空!\n");

  75.         return;

  76.     }

  77.     int e, i, k = 0;

  78.     printf("请输入你想要查找的数字:\n");

  79.     scanf("%d", &e);

  80.     for (i = 0; i < L->length; i++) {

  81.         if (e == L->elem[ i]) {

  82.             k = 1;

  83.             break;

  84.         }

  85.     }

  86.     if (k == 1) {

  87.         printf("查找成功,位于第%d位\n", i + 1);

  88.     } else {

  89.         printf("查找失败!\n");

  90.     }

  91. }



  92. void shanchuduoyu(sqlist *L)

  93. {

  94.     if (L->length == 0) {

  95.         printf("顺序表为空!\n");

  96.         return;

  97.     }

  98.     int i, j;

  99.     for (i = 0, j = 1; j < L->length; j++) {

  100.         if (L->elem[ i] != L->elem[j]) {

  101.             L->elem[++i] = L->elem[j];

  102.         }

  103.     }

  104.     L->length = i + 1;

  105.     printf("删除成功\n");

  106.     DisplayList(L);

  107. }



  108. int main()

  109. {

  110.     sqlist L;

  111.     int i, e;

  112.     initlist(&L);

  113.     listinsert(&L, i, e);

  114.     listdelete(&L, i, e);

  115.     search(&L);

  116.     shanchuduoyu(&L);

  117.     return 0;

  118. }

复制代码



第五题的实现思路:



1. 遍历顺序表,如果当前元素与前一个元素相同,则将当前元素删除。



2. 删除元素后,需要将后面的元素向前移动。



3. 最后,更新顺序表的长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-20 22:11:10 | 显示全部楼层
isdkz 发表于 2023-9-20 21:57
代码中存在一些问题,具体如下:



1. 在listinsert函数中,已经定义了参数i和e,不需要再次输入,应该 ...

这个最后还需要排个序,排成递增的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 07:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表