線性表實現(連結串列)
阿新 • • 發佈:2018-12-24
連結串列結構
typedef int ElemType;
typedef int Bool;
#define True 1
#define False 0
typedef enum{
success = 0,
fail,
range_error,
fatal
}Status;
typedef struct Node{
ElemType data;
struct Node * next;
}Node;
線性表操作
- 初始化 :
時間複雜度: O(1)
Status init(Node *linkedTable) {
Status s = success;
Node *header = (Node *)malloc(sizeof(Node));
if(header){
header -> next = NULL;
linkedTable = header;
}else{
s = fatal;
}
return s;
}
- 清空 :
時間複雜度: O(n)
void clear(Node *linkedTable){
Node *deleteNode;
while(linkedTable -> next) {
deleteNode = linkedTable->next;
linkedTable->next = deleteNode ->next;
free(deleteNode);
}
}
- 銷燬 :
時間複雜度: O(1)
void destroy(Node *linkedTable){
clear(linkedTable);
free(linkedTable); // 釋放頭節點
linkedTable = NULL;
}
- 查詢(按位置) :
時間複雜度: O(n)
Status retrieveByPos(Node *linkedTable, int pos, ElemType *ele){
Status s = range_error;
Node *ptr = linkedTable -> next; //ptr point to the first node
int i = 1;
while(ptr && i < pos) {
i++;
ptr = ptr ->next;
}
if(i == pos && ptr) {
*ele = ptr->data;
}
return s;
}
- 查詢(按值) :
時間複雜度: O(n)
Status locateByValue(Node *linkedTable, ElemType value ,int *pos){
Status s = range_error;
Node *ptr = linkedTable->next;
int i = 1;
while(ptr && ptr->data != value) {
i++;
ptr = ptr->next;
}
if(ptr){
*pos = i;
s = success;
}
return s;
}
- 插入 :
- 時間複雜度: O(n).
Status insertByPos(Node *linkedTable, int pos, ElemType ele){
Status s = range_error;
Node *ptr = linkedTable; //這裡不能指向第一元素,因為可能刪除第一個元素
int i = 0;
while(i < pos -1 && ptr) {
i++;
ptr = ptr->next;
}
if (i == pos - 1 && ptr) {
Node *newNode = (Node *) malloc(sizeof(Node));
if(newNode) {
newNode -> data = ele;
newNode -> next = ptr -> next;
ptr ->next = newNode;
s = success;
}else{
s = fatal;
}
}
return s;
}
- 刪除 :
- 時間複雜度: O(n)
Status deleteyPos(Node *linkedTable, int pos){
Status s= range_error;
Node *ptr = linkedTable; //這裡不能指向第一元素,因為可能刪除第一個元素
int i = 0;
while(i < pos -1 && ptr) {
i++;
ptr = ptr->next;
}
if(i == pos -1 && ptr) { //判斷存在第pos-1元素存在
if(ptr -> next != NULL){ //第pos元素(要刪除的元素)存在
Node * deleteNode = ptr -> next;
ptr -> next = ptr -> next -> next;
free(deleteNode);
deleteNode = NULL;
s = success;
}
}
return s;
}
- 判斷是否為空 :
時間複雜度: O(1)
Bool isEmpty(Node *linkedTable){
return (linkedTable->next == NULL)? True:False;
}
- 獲取線性表大小 :
時間複雜度: O(n)
int getLength(Node *linkedTable){
int i = 0;
Node *ptr = linkedTable->next;
while(ptr) {
i++;
ptr = ptr -> next;
}
return i;
}
- 尾部插入 :
時間複雜度: O(n)
Status appendList(PNode header,int data){
Status s = success;
Node *ptr = header;
while(ptr && ptr->next != NULL){
ptr = ptr ->next;
}
Node *tmp = (Node *) malloc(sizeof(Node));
if(tmp){
tmp -> data = data;
tmp -> next = NULL;
ptr -> next = tmp;
} else{
s = fatal;
}
return s;
}