線性表(資料結構 嚴蔚敏)
阿新 • • 發佈:2018-11-17
網上加書本擼的程式碼,沒啥大意思
#include<stdio.h> #include<string.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType; #define LIST_INIT_SIZE 10 #define LISTINCREMENT 2 typedef struct { ElemType *elem; int length; int listsize; }SqList; Status InitList(SqList *L) /* 演算法2.3 */ { /* 操作結果:構造一個空的順序線性表 */ (*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!(*L).elem) exit(OVERFLOW); /* 儲存分配失敗 */ (*L).length=0; /* 空表長度為0 */ (*L).listsize=LIST_INIT_SIZE; /* 初始儲存容量 */ return OK; } Status ClearList(SqList *L) { /* 初始條件:順序線性表L已存在。操作結果:將L重置為空表 */ (*L).length=0; return OK; } Status ListEmpty(SqList L) { /* 初始條件:順序線性表L已存在。操作結果:若L為空表,則返回TRUE,否則返回FALSE */ if(L.length==0) return TRUE; else return FALSE; } Status ListInsert(SqList *L,int i,ElemType e) /* 演算法2.4 */ { /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L)+1 */ /* 操作結果:在L中第i個位置之前插入新的資料元素e,L的長度加1 */ ElemType *newbase,*q,*p; if(i<1||i>(*L).length+1) /* i值不合法 */ return ERROR; if((*L).length>=(*L).listsize) /* 當前儲存空間已滿,增加分配 */ { newbase=(ElemType *)realloc((*L).elem,((*L).listsize+LISTINCREMENT)*sizeof(ElemType)); if(!newbase) exit(OVERFLOW); /* 儲存分配失敗 */ (*L).elem=newbase; /* 新基址 */ (*L).listsize+=LISTINCREMENT; /* 增加儲存容量 */ } q=(*L).elem+i-1; /* q為插入位置 */ for(p=(*L).elem+(*L).length-1;p>=q;--p) /* 插入位置及之後的元素右移 */ *(p+1)=*p; *q=e; /* 插入e */ ++(*L).length; /* 表長增1 */ return OK; } Status ListDelete(SqList *L,int i,ElemType *e) /* 演算法2.5 */ { /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */ /* 操作結果:刪除L的第i個數據元素,並用e返回其值,L的長度減1 */ ElemType *p,*q; if(i<1||i>(*L).length) /* i值不合法 */ return ERROR; p=(*L).elem+i-1; /* p為被刪除元素的位置 */ *e=*p; /* 被刪除元素的值賦給e */ q=(*L).elem+(*L).length-1; /* 表尾元素的位置 */ for(++p;p<=q;++p) /* 被刪除元素之後的元素左移 */ *(p-1)=*p; (*L).length--; /* 表長減1 */ return OK; } Status GetElem(SqList L,int i,ElemType *e) { /* 初始條件:順序線性表L已存在,1≤i≤ListLength(L) */ /* 操作結果:用e返回L中第i個數據元素的值 */ if(i<1||i>L.length) exit(ERROR); *e=*(L.elem+i-1); return OK; }