/* 数据结构中对线性表的操作 使用的数据元素存储方式是静态存储 */ #include<stdio.h> #include<stdlib.h> #define LIST_INIT_SIZE 100 typedef int ElemType; typedef struct { int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */ int length; ElemType *elem; }SqList; // 初始化线性表 int InitList(SqList *L){ L->elem = (ElemType * )malloc(LIST_INIT_SIZE * sizeof(ElemType)); if(!L->elem){ printf("Space allocation failed"); exit(1); } L->length = 0; L->listsize = LIST_INIT_SIZE; printf("Space allocation successfully\n"); return 0; } // 创建顺序表并向表中加入数据 ElemType a[ ]代表的是一个数组, n代表的是数组的大小 int CreateList(SqList *L, const ElemType a[ ],int n){ InitList(L); //调用初始化函数 int k=0; for (int i = 0; i < n; ++i) { L->elem[k] = a[i]; printf("To create elements: %d \n", L->elem[k]); k++; L->length =k; } printf(" \n"); return 0; } // 计算当前顺序线性表的长度 int ListLength(SqList *L){ printf("The curren length:%d\n", L->length); return L->length; } //得到自己想要的元素 其中i代表L中的第i个数据元素的值 int GetElem(SqList *L, int i){ int *value; //elem用来存储从data中获取得到的值; if(i<0||i>L->length) { printf("I value too big or too small\n"); exit(1); } value = &L->elem[i-1]; printf("The value of the element: %d\n", *value); return *value; } //知道这个值,但是想要知道这个值所在的下标, value代表这个值 int LocateElem(SqList *L, ElemType value){ int len = 1; //这里等于1是为了让 if(len>L->length) 这个条件成立 for (int j = 0; j < L->length; ++j) { if(L->elem[j] == value) { printf("Subscript of value:%d\n", j); } len++; } if(len>L->length) printf("this value %d not exist\n", value); return 0; } // 判断当前顺序表是否是空表 int EmptyList(SqList*L){ if(L->length==0){ printf("The list is empty!!!"); return 1; } return 0; } // 插入值 其中i代表要插入的位置, value代表要插入的值 int InsertList(SqList *L, int i, ElemType value){ int k; if( (i<0) || (i>L->length+1) ) { printf("Invalid location!!!\n"); exit(1); } if( L->length > LIST_INIT_SIZE ) { printf("The current is full!!!\n"); exit(1); } //如果在i=0的时候要另拿出来进行比较元素后移 if(i!=0){ for (k = L->length; k >= i; k--) { L->elem[k] = L->elem[k - 1]; } L->elem[i - 1] = value; L->length++; }else{ for (k = L->length; k >= i; k--) { L->elem[k+1] = L->elem[k]; } L->elem[i] = value; L->length++; } printf("Insert complete\n"); printf("\n"); return 0; } // 删除顺序表线性表L的第i个元素,并且用value来返回 int DeleteList(SqList *L, int i){ ElemType value, *p, *q; EmptyList(L); if( (i<0) || (i>L->length) ){ printf("illegal value of I"); } if(i!=0) { value = L->elem[i - 1]; q = &(L->elem[L->length - 1]); for (p = &(L->elem[i - 1]); p < q; p++) { *p = *(p + 1); } --L->length; } else{ value = L->elem[i]; q = &(L->elem[L->length - 1]); for (p = &(L->elem[i]); p < q; p++) { *p = *(p + 1); } --L->length; } printf("Delete complete"); printf(" \n"); return value; } // 销毁顺序线性表 int DestoryList(SqList *L){ free(L->elem); L->length = 0; L->elem = NULL; L->listsize = 0; return 0; } // 重置顺序线性表为空表 int ClearList(SqList *L){ L->length = 0; return 0; } int main(){ int a[] = {3,4,5,6}; int b[] = {2,3,4,5}; SqList L; CreateList(&L, b, 4); // 因为在创建时向里面添加数据时,调用了初始化的函数 InitList函数,所以会再次调用初始化函数。 // ListLength(&L); // GetElem(&L, 2); // LocateElem(&L, 5); // InsertList(&L, 4,6); DeleteList(&L, 4); for (int i = 0; i < L.length; ++i) { printf("%d ", L.elem[i]); } }
数据结构中顺序表线性表的部分操作
最新推荐文章于 2023-07-26 16:07:01 发布