#include <stdio.h> #include <stdlib.h> //基本操作函數用到的狀態碼 #define TRUE 1; #define FALSE 0; #define OK 1; #define ERROR 0; #define INFEASIBLE -1; //當不可行時 const int OVERFLOW = -2; //當溢出時 //表中數據元素的最大數量 const int MaxSize = 1000; //Status是新定義的一種函數返回值類型,其值為int型,意義為函數運行結果 狀態碼 typedef int Status; //定義一種 數據元素 類型 typedef char ElemType; //順序表定義 typedef struct { ElemType *elem; int length; } SqList; //基本操作1:線性表初始化 Status InitList(SqList *list) { //構造一個空的順序表 list->elem=(ElemType*)malloc(sizeof(ElemType)*MaxSize); //為順序表分配空間 if(!list->elem) { //存儲分配失敗 return OVERFLOW; }; list->length=0; //空表長度為0 return OK; //返回狀態 }; //基本操作2:線性表銷毀 Status DestroyList(SqList *list) { if(list->elem){ //線性表存在 free(list->elem); //free(p),p是指針或地址 //free((*list).elem); //也一樣 }; return OK; }; //基本操作3:線性表清空 Status ClearList(SqList *list) { if(list->length!=0){ //線性表存在 list->length=0; return OK; }; }; //基本操作4:求線性表長 int GetLength(SqList list) { if(list.elem){ //線性表存在 return list.length; }; } //基本操作5:判斷線性表是否為空 int IsEmpty(SqList list) { if(list.elem){ //線性表存在 if(list.length==0){ return TRUE; } else { return FALSE; } } } //基本操作6:根據結點索引i獲取相應位置元素的內容 Status GetElem(SqList list,int i,ElemType *elem) { if(i<1||i>list.length) { //判斷i值是否合理 return ERROR; } else { // 將中間結點值替換為目標結點的值 *elem=list.elem[i-1]; return OK; } } //基本操作7:查找與目標元素值相同的元素結點,返回邏輯下標 ,若不存在,返回0 int LocateElem(SqList list,ElemType elem){ int i; for(i=0;i<list.length;i++){ if(list.elem[i]==elem) return i+1; } return 0; } //基本操作8:插入結點元素到指定位置。(i為邏輯位置) Status ListInsert(SqList* list,int i,ElemType elem){ if(i<1||i>list->length+1) return ERROR; if(list->length==MaxSize) return OVERFLOW; int j; for(j=list->length-1;j>=i-1;j--){ list->elem[j+1]=list->elem[j]; } list->elem[i-1]=elem; list->length++; return OK; } //基本操作9:順序表的結點刪除,被刪除的結點值保存在參數elem Status ListDelete(SqList* list,int i,ElemType* elem){ if(i<1||i>list->length) return ERROR; int j; *elem=list->elem[i-1]; for(j=i;j<=list->length-1;j++){ list->elem[j-1]=list->elem[j]; } list->length--; return OK; } //基本操作10:順序表元素遍歷輸出 Status ListTraverse(SqList list){ int j; printf("邏輯序號:\t元素值:\n"); for(j=0;j<list.length;j++){ printf(" %d\t\t %c\n",j+1,list.elem[j]); } return OK; }//PriorElem(list,cur_e,&pre_e); //NextElem(list,cur_e,&next_e); int main(void){ //定義一個線性表 SqList list1; //初始化線性表 Status initResultCode = InitList(&list1); //賦值 ElemType elem1,elem2,elem3; elem1='Y'; elem2='C'; elem3='L'; list1.elem[0]=elem1; list1.elem[1]=elem2; list1.elem[2]=elem3; list1.length=3; //printf("初始化結果狀態碼為:%d\n",initResultCode); //1 //清空 /* printf("清空前線性表長:%d\n",GetLength(list1)); Status clearResultCode = ClearList(&list1); printf("清空后線性表長:%d\n",GetLength(list1)); printf("清空結果狀態碼為%d\n",clearResultCode); //1 */ //銷毀 free()配合malloc() /* printf("線性表釋放前,首結點值:%c\n",list1.elem[0]); //Y Status destroyResultCode = DestroyList(&list1); printf("線性表釋放后,首結點值:%c\n",list1.elem[0]); //? printf("銷毀結果狀態碼為%d\n",destroyResultCode); //1 */ //為空? /* int isNull = IsEmpty(list1); printf("為空?%d\n",isNull); */ //遍歷 /* ListTraverse(list1); */ //用 中間元素elemx 保存索引到的元素的值 /* ElemType elemx='L'; Status getElemResult = GetElem(list1,2,&elemx); printf("\n得到元素?:%d\n",getElemResult); printf("list1表中 'elem(2)' 中的值:%c\n",elemx); */ //查找表中與目標元素值相同的元素的 邏輯位置(第幾個) /* ElemType elemTargetValue='L'; //目標元素 int resultIndex=LocateElem(list1,elemTargetValue); printf("目標元素邏輯位置為:%d\n",resultIndex); */ //插入 /* ElemType elemReadyInserted='T'; Status insertResultCode=ListInsert(&list1,1,elemReadyInserted); printf("插入后表長:%d\n",list1.length); printf("1號元素值:%c\n",list1.elem[0]); printf("插入結果狀態碼:%d\n",insertResultCode); */ //刪除元素結點 /* ElemType deletedElem; //保存被刪除的結點值 Status deleteResultCode=ListDelete(&list1,1,&deletedElem); printf("刪除結果狀態碼:%d\n",deleteResultCode); printf("表長:%d\n",list1.length); printf("現在的1號結點值:%c\n",list1.elem[0]); printf("被刪除的結點值:%c\n\n",deletedElem); */ return 0; };