1. 程式人生 > >順序表的初始化、插入、刪除

順序表的初始化、插入、刪除

昨天晚上做了中移動蘇州軟體公司的暑期實習崗的筆試題,感覺備受打擊,尤其是自以為是的資料結構題(從快排、歸併排序、堆排序中選一種實現),碎決定再次學習資料結構一次,並將重要的資料結構用程式實現。
這裡先實現的是順序表的初始化,插入和刪除操作。

#include<iostream>
using namespace std;
// - - - - 線性表的動態分配順序儲存結構 - - - - 
#define LIST_INIT_SIZE 100  //儲存空間的初始分配量
#define INCREMENT 10        //儲存空間的分配增量
#define ElemType char
typedef struct{ //線性表的儲存結構 ElemType *elem; //儲存空間基地址 int length; //當前長度 int listsize; //當前分配的儲存容量 }SqList; //線性表的初始化 int InitList_Sq(SqList *L){ L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//動態分配儲存空間 if (L->elem == NULL) return 0; L->length
= 0; L->listsize = LIST_INIT_SIZE; return 0; } int ListInsert_Sq(SqList *L, int i, ElemType e){ //在順序表L的第i個位置之前插入元素e if (i<1 || i>L->length + 1) cout << "i值不合法" << endl; if (L->length >= L->listsize){ //當前空間已滿,增加分配 ElemType *newbase
= (ElemType *)realloc(L->elem, (L->listsize + INCREMENT)*sizeof(ElemType)); if (newbase = NULL){ cout << "分配失敗" << endl; return 0; } L->elem = newbase; //新基地址 L->listsize += INCREMENT;//增加儲存容量 } ElemType *q = &(L->elem[i - 1]);//q為插入位置 for (ElemType *p = &(L->elem[L->length - 1]); p >= q; --p) *(p + 1) = *p; //插入位置及其後的元素右移 *q = e; //插入元素 +L->length; //表長加1 return 1; } int ListDelete_Sq(SqList *L, int i, ElemType *e){ //順序表中刪除第i個元素,並用e返回其值 if (i<1 || i>L->length + 1){ //i的合法值為1length cout << "i值不合法" << endl; return 0; } ElemType *p = &(L->elem[i - 1]); //p為被刪除的元素的位置 *e = *p; //把p的值賦給e ElemType *q = L->elem + L->length - 1;//表尾元素的位置 for (++p; p <= q; ++p) *(p - 1) = *p; --L->length; return 0; } int main(){ SqList L; InitList_Sq(&L); for (int i = 0; i < 22; i++) ListInsert_Sq(&L, 1, 'a' + i); ElemType e; ListDelete_Sq(&L, 10, &e); cout << "刪除的元素是" << e; for (int j = 0; j < L.length; j++) cout << L.elem[j]; return 0; }