順序表的初始化、插入、刪除
阿新 • • 發佈:2018-12-30
昨天晚上做了中移動蘇州軟體公司的暑期實習崗的筆試題,感覺備受打擊,尤其是自以為是的資料結構題(從快排、歸併排序、堆排序中選一種實現),碎決定再次學習資料結構一次,並將重要的資料結構用程式實現。
這裡先實現的是順序表的初始化,插入和刪除操作。
#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的合法值為1到length
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;
}