|
发表于 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. 最后,更新顺序表的长度。 |
|