資料結構【清華嚴蔚敏】——順序表的基本運算
阿新 • • 發佈:2018-12-20
順序表的基本運算如下: (1)初始化順序表L (2)依次插入a,b,c,d,e元素 (3)輸出順序表L:a b c d e (4)順序表L長度:5 (5)順序表L為非空 (6)順序表L的第3個元素:c (7)元素a的位置:1 (8)在第4個元素位置上插入f元素 (9)輸出順序表L:a b c f d e (10)刪除L的第3個元素 (11)輸出順序表L:a b f d e (12)釋放順序表L
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef char ElemType; typedef int Status; typedef struct { ElemType *elem; int length; int listsize; } SqList; // 演算法2.3 初始化 Status InitList_Sq(SqList &L) { L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if (!L.elem) exit(-1); // 儲存分配失敗 L.length = 0; L.listsize = LIST_INIT_SIZE; return OK; } // 演算法2.4 插入 Status ListInsert_Sq(SqList &L, int i, ElemType e) { ElemType *p, *q; if (i < 1 || i > L.length+1) {// i的合法值為1≤i≤ListLength_Sq(L)+1 return ERROR; } if (L.length >= L.listsize) {// 當前儲存空間已滿,增加容量 ElemType *newbase = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof (ElemType)); if (!newbase) return ERROR; L.elem = newbase; L.listsize += LISTINCREMENT; } q = &(L.elem[i-1]); for (p = &(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p; *q = e; ++L.length; return OK; } //演算法2.5 刪除 Status ListDelete_Sq(SqList &L,int i, ElemType &e) { ElemType *p,*q; if(i<1||i>L.length) return ERROR; p=L.elem+i-1; //p=&(L.elem[i-1]); e=*p; q=L.elem+L.length-1;//最後一個元素的位置 for(++p;p<=q;p++) *(p-1)=*p; --L.length; } //銷燬順序表操作 Status DestroyList(SqList &L) { free(L.elem); L.elem=NULL; L.length=0; L.listsize=0; return OK; } Status ListEmpty(SqList L) { if(L.length==0) return 1; else return 0; } int main() { char A[5] = {'a','b','c','d','e'},temp='f'; //temp用來存放插入的字元以及儲存刪除字元的值 int i; SqList List; InitList_Sq(List); for(i=1; i<=5; i++) ListInsert_Sq(List,i,A[i-1]); if(!ListEmpty(List)) printf("順序表非空\n"); printf("開始時元素序列為:\n"); for(i=1; i<= List.length; i++) printf("%c ", List.elem[i-1]); i=4; //插入位置 ListInsert_Sq(List,i,temp); printf("\n插入後的元素序列為:\n"); for(i=1; i<= List.length; i++) printf("%c ", List.elem[i-1]); i=3; ListDelete_Sq(List,i,temp) ; printf("\n刪除後的元素序列為:\n"); for(i=1; i<= List.length; i++) printf("%c ", List.elem[i-1]); if(DestroyList(List)) printf("\n成功釋放順序表L"); getchar(); }