資料結構學習 鍊錶 單鏈表

2021-10-02 20:12:51 字數 4372 閱讀 5838

c語言資料結構之鍊錶

首先呢,開始資料結構中的第乙個部分-----線性表

首先我們想到的問題一定是定義乙個結構體變數:

//定義鍊錶

typedef struct node

node;

定義好了乙個結構體變數,接下來呢,乙個鍊錶得有個頭,對吧:

//建立頭節點

node* creatheadnode()

接下來呢,定義乙個函式來產生乙個新節點:

//建立乙個節點

node* creatnode(int data)

接下來呢,當然要考慮怎樣連線這些節點呢,有兩種方法供我們選擇:

1.頭插法

//將鍊錶連線(頭插法)

即相當於先把newnode的next與headnode->next連線,再把head->next與newnode相連即可。

2.尾插法

//將鍊錶連線(尾插法)

void connectnodebytail(node* headnode, int data)

其實可以將尾接法看作頭接法在最後將headnode移動到newnode的位置,這樣可以保證乙個鍊錶的順序是正向的(可以在後面的測試樣例中看出)。

然後呢,我們就應該考慮乙個鍊錶具有哪些功能呢?

1.插入

//插入

node* insertnode(int data, int i,node* headnode)

if (!headnode || j > i)

insertnode->next = headnode->next;

headnode->next = insertnode;

return headnode;

}

2.刪除

//刪除

node* deletenode(int i,node* headnode)

if (!headnode || j > i)

connectnode = headnode->next;

headnode->next = connectnode->next;

free(connectnode);

return headnode;

}

3.取出某位元素

//取出元素

void take_outnode(node* headnode, int i)

if (!headnode || j > i)

printf("第%d個元素為%d\n", i, headnode->data);

}

4.反轉鍊錶

//反轉

node* flip_node(node* headnode)

printf("%d\t", pr->data);

return pr;

}

5.鍊錶長度

//鍊錶長度

int length(node* headnode)

return i-1;

}

6.清空鍊錶

//清空鍊錶

void clear_node(node* headnode)

while (headnode)

free(node_clear);

}

接下來呢,我們想要檢驗我們做的對不對呢,是不是可以封裝乙個函式來列印鍊錶呢

//列印鍊錶(方便檢驗)

void printlist(node* headnode)

printf("\n");

}

下面呢,就來看看整體的**吧

#include #include #include //定義鍊錶

typedef struct node

node;

//建立頭節點

node* creatheadnode()

//建立乙個節點

node* creatnode(int data)

//將鍊錶連線(頭插法)

void connectnodebyhead(node* headnode, int data)

//將鍊錶連線(尾插法)

void connectnodebytail(node* headnode, int data)

//插入

node* insertnode(int data, int i,node* headnode)

if (!headnode || j > i)

insertnode->next = headnode->next;

headnode->next = insertnode;

return headnode;

}//刪除

node* deletenode(int i,node* headnode)

if (!headnode || j > i)

connectnode = headnode->next;

headnode->next = connectnode->next;

free(connectnode);

return headnode;

}//取出元素

void take_outnode(node* headnode, int i)

if (!headnode || j > i)

printf("第%d個元素為%d\n", i, headnode->data);

}//反轉

node* flip_node(node* headnode)

printf("%d\t", pr->data);

return pr;

}//鍊錶長度

int length(node* headnode)

return i-1;

}//清空鍊錶

void clear_node(node* headnode)

while (headnode)

free(node_clear);

}//列印鍊錶(方便檢驗)

void printlist(node* headnode)

printf("\n");

}int main()

; srand(time(null));

printf("原數值:\n");

for (int i = 0;i < 10;i++)

printf("\n");

node* headnode_head = creatheadnode();

printf("使用頭插法:\n");

for (int i = 0;i < 10;i++)

printlist(headnode_head);

node* headnode_tail = creatheadnode();

printf("使用尾插法:\n");

for (int i = 0;i < 10;i++)

printf("\n以頭插法為例,在第2個位置插入5:\n");

insertnode(5, 2, headnode_head);

printlist(headnode_head);

printf("以頭插法為例,刪除第二個位置的元素: \n");

deletenode(2, headnode_head);

printlist(headnode_head);

take_outnode(headnode_head, 2); //取出第二個元素

printf("該鍊錶長度為%d\n", length(headnode_head));

printf("翻轉後鍊錶:\n");

printlist(flip_node(headnode_head));

clear_node(headnode_head);

printf("清空鍊錶後的第乙個元素:\n%d\n", headnode_head->data);

system("pause");

return 0;

}

最後呢,我們來檢驗一下吧

大功告成!!

作為自己的第一篇文章,如果有什麼問題請指正,謝謝。

資料結構 鍊錶 單鏈表

陣列作為資料儲存結構有一定缺陷。無序陣列搜尋低效,有序陣列插入低效 無論哪種陣列,刪除低效 大小固定,無法所以改變。但是陣列的優勢是通過下標隨機訪問各個資料。鍊錶可以取代陣列作為儲存資料的基礎,比如棧,佇列。鍊錶分類 單鏈表 雙端鍊錶 有序鍊錶 雙向鍊錶 有迭代器的鍊錶 迭代器是用來隨機訪問鍊錶元素...

資料結構 鍊錶(單鏈表)

頭指標與頭結點不同,頭結點即第乙個結點,頭指標是指向第乙個結點的指標。鍊錶中可以沒有頭結點,但不能沒有頭指標。include using namespace std struct node node int d class list void insert int d void print node...

資料結構 鍊錶,單鏈表篇

概述 線性表的鏈式儲存結構稱為鍊錶,其中每個節點不僅包含元素本身資訊,而且包含標識元素之間的邏輯關係的資訊,在c c 中常用指標來實現,這稱為指標域。順序表中邏輯上相鄰元素對應的儲存位置也相鄰,所以執行插入刪除操作時候平均需要移動半個表的元素,而鍊錶不同,邏輯上相鄰元素對應的儲存位置不一定相鄰,它是...