//顺序表的实现:(分配一段连续地址给顺序表,像数组一样去操作) #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define LIST_INIT_SIZE 100 #define INCREMENT 10 typedef int ElemType; typedef struct{ ElemType *elem;//数组指针代表存储基址 int length;//当前顺序表长度 int listsize;//当前已经分配的空间大小 }Sqlist;//顺序表的长度不一定会占满已经分配的空间 static Sqlist L; static int e; int Initlist(Sqlist *L){ int i,length; printf("请输入顺序表的长度:\n"); scanf("%d",&length); L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L->elem){ return ERROR; } printf("输入%d个元素,以空格隔开:\n",length); for(i=0;i<length;i++){ scanf("%d",&L->elem[i]); } L->length=length; L->listsize=LIST_INIT_SIZE; return OK; } void TraverseList(Sqlist *L){ int i; if(!L){ printf("空表!"); exit(ERROR); } for(i=0;i<L->length;i++){ printf("%d\n",L->elem[i]); } } int ListInsert(Sqlist *L,int e,int m){ ElemType *newbase; ElemType *p,*q; if(m<1||m>L->length){ return ERROR; } if(L->length>=L->listsize){ printf("当前空间满了!重新分配内存\n"); newbase=(ElemType *)realloc(L->elem,(L->listsize+INCREMENT)*sizeof(ElemType)); if(!newbase){ return ERROR; } L->elem=newbase; L->listsize+=INCREMENT; } q=&(L->elem[m-1]); for(p=&(L->elem[L->length-1]);p>=q;p--){ *(p+1)=*p;//从后往前依次后移 } *q=e; L->length++; return OK; } int ListDelete(Sqlist *L,int m){ if(m<1||m>L->length){ return ERROR; }else{ ElemType *p,*q; p=&(L->elem[m-1]); free(p); for(q=&(L->elem[L->length-1]);q>L->elem[m-1];q++){ *(q-1)=*q;//从后往前依次前移 } } return OK; } int main(){ int i,n,m; if(Initlist(&L)==ERROR){ printf("创建失败!"); return ERROR; } TraverseList(&L); printf("输入要插入元素的和要插入的位置 用空格隔开!\n"); scanf("%d%d",&n,&m); TraverseList(&L); printf("输入要删除的元素位置:\n"); scanf("%d",&n); if(!ListDelete(&L,n)){ printf("删除失败!"); TraverseList(&L); } return OK; }
时间: 2024-10-08 00:49:48