單鏈表的初始化 查詢 刪除 插入 釋放

2021-08-06 04:35:49 字數 3267 閱讀 8839

/*

get1、我這裡的單獨建立了乙個結構體 list來儲存整個鍊錶的資訊和一般的參考書上可能不一樣

2、實際的單鏈表由 list裡面的 頭結點head進行連線。

3、頭結點有資料域和指標域 ,資料域可以任意替換

4、本程式實現了

①、單鏈表的建立(使用尾插法,符合先進先出的生活邏輯。頭插法也可以)

②、單鏈表的刪除(釋放所有節點,head=null, 鍊錶長度為0);

③、節點的插入、刪除、查詢(獲取)

5、單鏈表 <->順序儲存結構 相比較(優缺點)

① 插入和刪除: 順序儲存複雜度是 o(n),單鏈表第一次o(n),之後o(1)。 所以 對於插入和刪除越頻繁的工作,單鏈表的效率就越明顯。

因為如果在同一位置連續插入10個元素, 第一次插入的時候如要逐個遍歷找到插入點, 但是之後就可以記錄下次插入點, 後面的幾次插

入就要快得多了。但是對於順序儲存結構的話,還要每次都要把插入點後面的元素向後移動,這樣會耗費很多時間的。

② 任一儲存單元的鏈式儲存結構 <-> 連續的儲存單元依次存放元素的順序儲存結構

③ 時間效能:

查詢:單鏈表o(n) 順序o(1)

插入刪除:單鏈表o(n)->o(1) 順序o(n);

④ 空間效能:

順序儲存需要預備更多的空間,會產生浪費。如果空間小了還會溢位。

單鏈表,隨時用隨時申請,不用了還可以釋放。

*/#include #include #include #define ok 1

#define error 0

#define true 1

#define false 0

typedef int elemtype;

typedef struct node

node;

typedef struct

list;

typedef int status;

//這個是尾插法 初始化鍊錶。 還有在我的程式裡面 我把node封裝在了乙個list結構體裡面 ,

//list的變數用來說明這個list的屬性

status initlist(list *list, int nodeamount);

//複雜度 o(n) 對於插入和刪除越頻繁的工作,單鏈表的效率就越明顯(在同一位置連續插入10個元素)

status insert(list *list, elemtype e, int index);//鍊錶下標還是從1開始

status delete(list *list, int index);

//獲取單個元素

status getelem(list *list, elemtype *e, int index);

//整表刪除

status freelist(list *list);

void test(list *list);

status iteratoroutput(list *list);

/* 1、鍊錶的建立與初始化(帶有頭指標)

2、遍歷鍊錶

3、單鏈表的插入和刪除(刪除後 記得釋放記憶體 鍊錶的長度的加減)

*///頭結點使得空鍊錶與非空煉表處理一致,並且方便對鍊錶的第乙個結點的插入和刪除操作。

int main(void)

e = 999;

//插入元素 e=999

if (insert(&list, e, 1) != ok )

// test(&list);

//刪除指定位置的元素

if (delete(&list, 4) != ok )

//遍歷鍊錶

iteratoroutput(&list);

//獲取前面插入的 999

getelem(&list, &e1, 1);

printf("\n獲取指定位置的元素進行輸出:%d\n", e1);

printf("釋放鍊錶\n");

freelist(&list);

printf("釋放後再對鍊錶進行遍歷,檢查是否釋成功:\n");

iteratoroutput(&list);

return 0;

}//手動申請的空間,不會被自動**。 不限制與這個函式的作用域裡面。

status initlist(list *list, int nodeamount)

p->next=null;

status = ok;

return status;

}status insert(list *list, elemtype e, int index)

for (i = 0; i < index - 1; i++)

node = (node *)malloc(sizeof(node)); //為插入的節點申請空間

node ->data = e;

node->next = p->next;

p->next = node;

list->length++; //鍊錶長度+1

return ok;

}status delete(list *list, int index)

else

r = p->next;

p->next = p->next->next;

free(r);

status = ok;

list->length--;//鍊錶長度-1

}return status;

}//不同的資料域需要有不同的輸入格式和輸出格式 在c語言裡面 如果遍歷得到每個元素的話,不太方便。

//因為不好設定iterator物件 還不如直接遍歷

status iteratoroutput(list *list)

p = list->head->next;

while(p) //c語言的null在實際的底層**中就是0

return ok;

}status getelem(list *list, elemtype *e, int index)

//1 2 3 4 5

for (i = 0; i < index; i++)

*e = p->data;

return ok;

}status freelist(list *list)

list->length = 0;

list->head = null;

return ok;}/*

void test(list *list)

}*/

單鏈表基本操作 初始化,建立,插入,查詢,刪除

單鏈表的初始化,建立,插入,查詢,刪除。include include typedef int elemtype 定義結點型別 typedef struct node node,linkedlist 單鏈表的初始化 linkedlist linkedlistinit 單鏈表的建立1,頭插法建立單鏈表...

單鏈表的初始化,刪除,銷毀,查詢

單鏈表的初始化,頭刪,尾刪,頭插,尾插,銷毀,查詢。node.h ifndef node h define node h typedef int datatype define null 0 include include includetypedef struct node node,linkli...

單鏈表的初始化

方法一 include using namespace std struct listnode class solution cout head val return positiveoutput head next 該函式的作用是倒序輸出結點值 listnode reverseoutput lis...