子任务名任务:1_2 动态顺序存储线性表的基本实现
环境:Visual Studio Code
/*子任务名任务:1_2 动态顺序存储线性表的基本实现*/#include <stdio.h>#include <stdlib.h>#include <string.h>#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define Status int#define OVERFLOW -1#define OK 1#define ERROR 0#define ElemType inttypedef struct{ElemType * elem;int length;int listsize;//当前分配的存储容量}SqList;//函数介绍Status InitList(SqList *L); //初始化Status ListInsert(SqList *L, int i,ElemType e);//插入Status ListDelete(SqList *L,int i,ElemType *e);//删除void ListPrint(SqList L);//输出打印void DeleteMin(SqList *L);//删除最小Status InitList(SqList *L)//初始化{L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//申请100空间if(!L->elem)//申请失败return ERROR;L->length = 0;//长度0L->listsize = LIST_INIT_SIZE;//容量100return OK;//申请成功}Status ListInsert(SqList *L,int i,ElemType e)//插入{int j;ElemType *newbase;if(i<1 || i>L->length+1)return ERROR;//非法输入if(L->length >= L->listsize)//存满了,需要更大空间{//realloc void * 改变已分配内存的大小newbase = (ElemType*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));//大10的空间if(!newbase)//申请失败return ERROR;L->elem = newbase;//调指针L->listsize+= LISTINCREMENT;//新容量}for(j=L->length;j>i-1;j--)//从后往前覆盖L->elem[j] = L->elem[j-1];L->elem[i-1] = e;//在留出的位置赋值L->length++;//长度+1return OK;}Status ListDelete(SqList *L,int i,ElemType *e)//删除{int j;if(i<1 || i>L->length)//非法输入/表空return ERROR;*e = L->elem[i-1];//为了返回值for(j = i-1;j <= L->length;j++)//从前往后覆盖L->elem[j] = L->elem[j+1];(L->length)--;//长度减1return OK;//返回删除值}void ListPrint(SqList L)//输出打印{int i;for(i=0;i<L.length;i++)printf("%d ",L.elem[i]);printf("\n");//为了美观}void DeleteMin(SqList *L)//删除最小{//表空在Listdelete函数里判断int i;int j=0;//最小值下标ElemType *e;for(i=0;i<L->length;i++)//寻找最小{if(L->elem[i] < L->elem[j])j=i;}/*ListDelete(L,j+1,&e) 纯C不支持*e类型,&e调用弹出警告:warning: passing argument 3 of 'ListDelete' from incompatible pointer type [-Wincompatible-pointer-types]警告:从不兼容的指针类型 [-Wincompatible-pointer-types] 传递“ListDelete”的参数 3*/ListDelete(L,j+1,&e);//调用删除,注意j要+1}int main(void){SqList L;int i;ElemType e;ElemType data[9] = {11,-22,-33,3,-88,21,77,0,-9};InitList(&L);for (i = 1; i <= 9; i++){ListInsert(&L,i,data[i-1]);}printf("插入完成后 L = : ");ListPrint(L);ListDelete(&L, 2, &e);printf("删除第 2 个后L = : ");ListPrint(L);DeleteMin(&L);printf("删除L中最小值后L = : ");ListPrint(L);DeleteMin(&L);printf("删除L中最小值后L = : ");ListPrint(L);DeleteMin(&L);printf("删除L中最小值后L = : ");ListPrint(L);}
报错
��̬˳��洢���Ա�ʾ.c: In function 'DeleteMin':��̬˳��洢���Ա�ʾ.c:98:22: warning: passing argument 3 of 'ListDelete' from incompatible pointer type [-Wincompatible-pointer-types]ListDelete(L,j+1,&e);//调用删除,注意j要+1^~��̬˳��洢���Ա�ʾ.c:64:45: note: expected 'int *' but argument is of type 'int **'Status ListDelete(SqList *L,int i,ElemType *e)//删除^
尝试原因
/*ListDelete(L,j+1,&e) 纯C不支持*e类型,&e调用弹出警告:warning: passing argument 3 of 'ListDelete' from incompatible pointer type [-Wincompatible-pointer-types]警告:从不兼容的指针类型 [-Wincompatible-pointer-types] 传递“ListDelete”的参数 3*/ListDelete(L,j+1,&e);//调用删除,注意j要+1
