單鏈表
單鏈表使用指針來保存線性表數(shù)據(jù)元素的關(guān)系。
實(shí)現(xiàn)要點(diǎn):
1.使用指針來指向下一個(gè)數(shù)據(jù)元素。
2.單鏈表分為帶頭結(jié)點(diǎn)的單鏈表、不帶頭結(jié)點(diǎn)的單鏈表。
3.使用帶頭結(jié)點(diǎn)的單鏈表不需要對(duì)空表進(jìn)行特殊處理,簡化操作。
優(yōu)缺點(diǎn)和適用場景:
適用于進(jìn)行大量插入、刪除操作的場景,不具備隨機(jī)存取的特性,訪問數(shù)據(jù)必須循環(huán)遍歷。
使用示例
功能:輸入數(shù)據(jù)個(gè)數(shù)和數(shù)據(jù),逆序保存到順序表,并逆序輸出顯示到屏幕。
運(yùn)行結(jié)果如下:
請(qǐng)輸入數(shù)據(jù)總個(gè)數(shù):10
請(qǐng)依次輸入10個(gè)整數(shù):0 1 2 3 4 5 6 7 8 9
單鏈表輸出結(jié)果:9 8 7 6 5 4 3 2 1 0
單鏈表刪除5位置數(shù)據(jù)后輸出結(jié)果:9 8 7 6 4 3 2 1 0
代碼實(shí)現(xiàn):帶頭點(diǎn)的單鏈表
*/
#include <stdio.h>
#include <stdlib.h>
// 定義單鏈表數(shù)據(jù)結(jié)構(gòu)
typedef struct list_node
{
int data;
struct list_node *next;
}list_node;
// 創(chuàng)建和初始化空鏈表
list_node *create_link_list()
{
// 創(chuàng)建頭節(jié)點(diǎn)
list_node *head = (list_node *)malloc(sizeof(list_node));
// 頭結(jié)點(diǎn)的data域保存長度
if(head == NULL)
return NULL;
head->data = 0;
head->next = NULL;
return head;
}
// 增加
int insert_link_list(list_node *list, int data ,int pos)
{
if(list == NULL || pos < 1 || pos > list->data+1)
return -1;
list_node *node = (list_node *)malloc(sizeof(list_node));
if(node == NULL)
return -1;
node->data = data;
node->next = NULL;
// 循環(huán)找到插入的位置
int i;
list_node *p = list;
for(i=0; i<pos-1; i++)
p = p->next;
node->next = p->next;
p->next = node;
list->data++;
return 0;
}
// 刪除
int delete_link_list(list_node *list, int *data, int pos)
{
if(list==NULL || pos < 1 || pos > list->data)
return -1;
// 循環(huán)找到要?jiǎng)h除的元素前一個(gè)位置
int i;
list_node *p = list;
for(i=0; i<pos-1; i++)
p = p->next;
list_node *q = p->next;
*data = q->data;
p->next = q->next;
free(q);
list->data--;
return 0;
}
// 查看
void print_link_list(list_node *list)
{
if(list != NULL)
{
list_node *p = list;
while((p=p->next) != NULL)
printf("%d ", p->data);
printf("\n");
}
}
// 銷毀
void free_link_list(list_node *list)
{
if(list != NULL)
{
list_node *p = NULL;
while((p=list->next) != NULL)
{
list->next = p->next;
free(p);
}
free(list);
}
}
int main(void)
{
list_node *list = create_link_list();
int n,d;
printf("請(qǐng)輸入數(shù)據(jù)總個(gè)數(shù):");
scanf("%d", &n);
printf("請(qǐng)依次輸入%d個(gè)整數(shù):", n);
int i;
for(i=0; i<n; i++)
{
scanf("%d", &d);
// 每次插入到鏈表首位,這樣實(shí)現(xiàn)倒序
insert_link_list(list, d, 1);
}
printf("單鏈表輸出結(jié)果:");
print_link_list(list);
printf("單鏈表刪除%d位置數(shù)據(jù)后輸出結(jié)果:",n/2);
delete_link_list(list, &d, n/2);
print_link_list(list);
free_link_list(list);
return 0;
}
其實(shí)做為一個(gè)學(xué)習(xí)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要這里我推薦一個(gè)C/C++基礎(chǔ)交流583650410,不管你是小白還是轉(zhuǎn)行人士歡迎入駐,大家一起交流成長。

