| 
 | 
 
 
发表于 2023-9-20 21:57:34
|
显示全部楼层
 
 
 
代码中存在一些问题,具体如下: 
 
 
 
1. 在listinsert函数中,已经定义了参数i和e,不需要再次输入,应该直接使用。 
 
 
 
2. 在listdelete函数中,应该先判断删除的位置是否合法,否则会出现数组越界的问题。 
 
 
 
3. 在search函数中,应该先判断顺序表是否为空,否则会出现数组越界的问题。 
 
 
 
4. 在shanchuduoyu函数中,应该先判断顺序表是否为空,否则会出现数组越界的问题。 
 
 
 
5. 在shanchuduoyu函数中,应该先判断顺序表是否有重复元素,否则会出现删除错误的问题。 
 
 
 
下面是修改后的代码: 
 
 
 
- #include <stdio.h>
 
 
 - #include <stdlib.h>
 
 
  
 
- #define maxsize 100
 
 
 - #define ok 1
 
 
  
 
- typedef int elemtype;
 
 
  
 
- typedef struct {
 
 
 -     elemtype *elem;
 
 
 -     int length;
 
 
 -     int initsize;
 
 
 - } sqlist;
 
 
  
 
- void initlist(sqlist *L)
 
 
 - {
 
 
 -     int n;
 
 
 -     printf("请输入你想创建的顺序表长度:\n");
 
 
 -     scanf("%d", &n);
 
 
 -     L->elem = (elemtype *) malloc(sizeof(elemtype) * n);
 
 
 -     L->length = 0;
 
 
 -     L->initsize = maxsize;
 
 
 -     printf("请输入顺序表里的数值:\n");
 
 
 -     for (int i = 0; i < n; i++) {
 
 
 -         scanf("%d", &L->elem[ i]);
 
 
 -         L->length++;
 
 
 -     }
 
 
 -     printf("顺序表创建成功\n");
 
 
 - }
 
 
  
 
- void DisplayList(sqlist *L)
 
 
 - {
 
 
 -     for (int i = 0; i < L->length; i++) {
 
 
 -         printf("%d ", L->elem[ i]);
 
 
 -     }
 
 
 -     printf("\n");
 
 
 - }
 
 
  
 
- void listinsert(sqlist *L, int i, elemtype e)
 
 
 - {
 
 
 -     printf("请输入你要插入的数字:\n");
 
 
 -     scanf("%d", &e);
 
 
 -     printf("请输入你要插入的位置:\n");
 
 
 -     scanf("%d", &i);
 
 
 -     if (i < 1 || i > L->length + 1) {
 
 
 -         printf("error!\n");
 
 
 -         return;
 
 
 -     }
 
 
 -     elemtype *p = &(L->elem[L->length - 1]);
 
 
 -     elemtype *q = &(L->elem[i - 1]);
 
 
 -     while (p >= q) {
 
 
 -         *(p + 1) = *p;
 
 
 -         p--;
 
 
 -     }
 
 
 -     *q = e;
 
 
 -     L->length++;
 
 
 -     printf("插入成功\n");
 
 
 -     DisplayList(L);
 
 
 - }
 
 
  
 
- void listdelete(sqlist *L, int i, elemtype e)
 
 
 - {
 
 
 -     printf("请输入你要删除第几位数:\n");
 
 
 -     scanf("%d", &i);
 
 
 -     if (i < 1 || i > L->length) {
 
 
 -         printf("error!\n");
 
 
 -         return;
 
 
 -     }
 
 
 -     elemtype *p = &(L->elem[i - 1]);
 
 
 -     while (p < &(L->elem[L->length - 1])) {
 
 
 -         *p = *(p + 1);
 
 
 -         p++;
 
 
 -     }
 
 
 -     L->length--;
 
 
 -     printf("删除成功\n");
 
 
 -     DisplayList(L);
 
 
 - }
 
 
  
 
- void search(sqlist *L)
 
 
 - {
 
 
 -     if (L->length == 0) {
 
 
 -         printf("顺序表为空!\n");
 
 
 -         return;
 
 
 -     }
 
 
 -     int e, i, k = 0;
 
 
 -     printf("请输入你想要查找的数字:\n");
 
 
 -     scanf("%d", &e);
 
 
 -     for (i = 0; i < L->length; i++) {
 
 
 -         if (e == L->elem[ i]) {
 
 
 -             k = 1;
 
 
 -             break;
 
 
 -         }
 
 
 -     }
 
 
 -     if (k == 1) {
 
 
 -         printf("查找成功,位于第%d位\n", i + 1);
 
 
 -     } else {
 
 
 -         printf("查找失败!\n");
 
 
 -     }
 
 
 - }
 
 
  
 
- void shanchuduoyu(sqlist *L)
 
 
 - {
 
 
 -     if (L->length == 0) {
 
 
 -         printf("顺序表为空!\n");
 
 
 -         return;
 
 
 -     }
 
 
 -     int i, j;
 
 
 -     for (i = 0, j = 1; j < L->length; j++) {
 
 
 -         if (L->elem[ i] != L->elem[j]) {
 
 
 -             L->elem[++i] = L->elem[j];
 
 
 -         }
 
 
 -     }
 
 
 -     L->length = i + 1;
 
 
 -     printf("删除成功\n");
 
 
 -     DisplayList(L);
 
 
 - }
 
 
  
 
- int main()
 
 
 - {
 
 
 -     sqlist L;
 
 
 -     int i, e;
 
 
 -     initlist(&L);
 
 
 -     listinsert(&L, i, e);
 
 
 -     listdelete(&L, i, e);
 
 
 -     search(&L);
 
 
 -     shanchuduoyu(&L);
 
 
 -     return 0;
 
 
 - }
 
 
 
  复制代码 
 
 
第五题的实现思路: 
 
 
 
1. 遍历顺序表,如果当前元素与前一个元素相同,则将当前元素删除。 
 
 
 
2. 删除元素后,需要将后面的元素向前移动。 
 
 
 
3. 最后,更新顺序表的长度。 |   
 
 
 
 |