1. 程式人生 > >線性表(資料結構 嚴蔚敏)

線性表(資料結構 嚴蔚敏)

網上加書本擼的程式碼,沒啥大意思

#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;
 }