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 中常用指標來實現,這稱為指標域。順序表中邏輯上相鄰元素對應的儲存位置也相鄰,所以執行插入刪除操作時候平均需要移動半個表的元素,而鍊錶不同,邏輯上相鄰元素對應的儲存位置不一定相鄰,它是...