bool ListDelete(SeqList *L,int i,ElemType *e){ if(i<1||i>L->length) return false; int b=0; b=L->data[i-1]; e=&b; int j=0; for( j=i;j<L->length;j++) L->data[j-1]=L->data[j]; L->length--; return true; }
时间: 2024-04-12 13:33:29 浏览: 84
这段代码是用于删除顺序表中指定位置的元素的函数。首先,它会检查要删除的位置i是否合法,即是否小于1或大于顺序表的长度。如果位置不合法,则返回false表示删除失败。然后,它会声明一个整型变量b,并将要删除的元素的值赋给b,即b = L->data[i-1]。接着,它将b的地址赋给指针e,即e = &b,这样可以通过指针e将删除的元素值传递给调用者。然后,它使用循环将位置i后面的所有元素向前移动一位,将第j个元素的值赋给第j-1个元素,覆盖掉要删除的元素。最后,它将顺序表的长度减1,并返回true表示删除成功。需要注意的是,该代码存在一个问题,即在函数结束后,指针e指向的内存空间会被释放,导致调用者无法正确获取删除的元素值。应该将参数e改为指针类型,即ElemType **e,然后使用 *e = b 的形式进行赋值。
相关问题
#define MAXSIZE 100 // 定义最大长度typedef struct { int data[MAXSIZE]; // 存放元素的数组 int length; // 当前长度} SqList; // 顺序表类型void InitList(SqList &L) { for (int i = 0; i < MAXSIZE; i++) { L.data[i] = 0; } L.length = 0;}bool ListInsert(SqList &L, int i, int e) { if (i < 1 || i > L.length + 1) { return false; } if (L.length >= MAXSIZE) { return false; } for (int j = L.length; j >= i; j--) { L.data[j] = L.data[j - 1]; } L.data[i - 1] = e; L.length++; return true;}bool ListDelete(SqList &L, int i, int &e) { if (i < 1 || i > L.length) { return false; } e = L.data[i - 1]; for (int j = i; j < L.length; j++) { L.data[j - 1] = L.data[j]; } L.length--; return true;}
这段代码是一个基于数组实现的顺序表,其中包括了初始化顺序表函数InitList,向顺序表中插入元素函数ListInsert,以及从顺序表中删除元素函数ListDelete。其中,顺序表的最大长度为MAXSIZE,通过结构体SqList来存储,其中data数组存放元素,length为当前长度。函数中使用了引用类型来修改传入的SqList对象。
下面算法功能是:在顺序表中,第i个元素前插入元素e。请将算法补充完整。#include<stdio.h>#include <math.h>#include <stdlib.h> #define LIST INIT SIZE 100#define LISTINCREAMENT 10 typedef int ElemType; typedef struct{ ElemType *elem; int length; int listsize;}SqList; bool ListInsert Sq(SqList &L, int i, ElemType e){ ElemType *p,*q; if(i<1|li>L.length+1) { printf"插入位置不正确!"); return false: if(L.length >= L.listsize) ElemType*newbase(ElemType*)realloc(L.elem,(LIST INITSIZE+LISTINCREAMENT)*sizeof(ElemType)) if!newbase) { printf("overflow!"); return false;} L.elem=newbase; L.listsize+=LISTINCREAMENT; /*将第i到第n个元素向后移动一位,将e插入到第i个元素的位置,表长增 1*1 return true;}
算法补充完整如下:
```
bool ListInsert(SqList &L, int i, ElemType e){
ElemType *p,*q;
if(i<1 || i>L.length+1) {
printf("插入位置不正确!");
return false;
}
if(L.length >= L.listsize) {
ElemType *newbase = (ElemType*)realloc(L.elem,(LISTINITSIZE+LISTINCREAMENT)*sizeof(ElemType));
if(!newbase) {
printf("overflow!");
return false;
}
L.elem = newbase;
L.listsize += LISTINCREAMENT;
}
q = &(L.elem[i-1]);
for(p = &(L.elem[L.length-1]); p>=q; --p) {
*(p+1) = *p;
}
*q = e;
++L.length;
return true;
}
```
具体思路:
- 判断插入位置是否正确,如果不正确则返回 false。
- 如果当前顺序表已满,则重新分配更大的空间。
- 将第 i 到第 n 个元素向后移动一位,腾出第 i 个元素的位置。
- 将元素 e 插入到第 i 个元素的位置。
- 表长增加 1,返回 true。
阅读全文