日韩在线免费播放-日韩在线免费av-日韩在线免费-日韩在线毛片-国产高清不卡视频-国产高清不卡

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 單鏈表

單鏈表 時間:2019-07-12      來源:沈陽中心,楊老師

鏈表用來解決1 順序表數據大量移動的問題

             2 解決順序表元素數量固定的問題

鏈表分為單向鏈表,雙向鏈表,單向循環鏈表,雙向循環鏈表

單鏈表通常有兩個域

數據域(保存數據)

指針域(保存下一個節點的位置)

單鏈表結構體定義如下

typedef struct node_t

{

int data;              //數據域

struct node_t *next;   //指針域,通過指針域可以找到下一個節點

}link_node_t;

 

typedef struct node_t

{

struct student data;              //數據域

struct node_t *next;   //指針域,通過指針域可以找到下一個節點

}link_node_t;

 

typedef struct node_t

{

char name[20];              //數據域

struct node_t *next;   //指針域,通過指針域可以找到下一個節點

}link_node_t;

/////////////////////////

有這些名字,我們用單鏈表將這些名字連接起來

"yang", "li", "liu", "wang"

#include <stdio.h>

typedef struct node_t

{

char name[20];              //數據域

struct node_t *next;   //指針域,通過指針域可以找到下一個節點

}link_node_t;

int main()

{

link_node_t *h;

link_node_t A = {"yang", NULL};

link_node_t B = {"li", NULL};

link_node_t C = {"liu", NULL};

link_node_t D = {"wang", NULL};

A.next = &B;

B.next = &C;

C.next = &D;

h = &A;

//輸出每個節點

while(h != NULL)

{

printf("%s\n", h->name);

h = h->next;

}

}

/////////////

單向鏈表 兩種類型

1  不帶頭結點的單向鏈表(鏈表中所有元素都是有效的)

上面名字例子:

2 帶頭結點的單向鏈表   (頭結點: 是一個空節點,這個節點不存有效數據,只有next是有效的)

#include <stdio.h>

typedef struct node_t

{

char name[20];              //數據域

struct node_t *next;   //指針域,通過指針域可以找到下一個節點

}link_node_t;

int main()

{

link_node_t h; //頭結點

link_node_t A = {"yang", NULL};

link_node_t B = {"li", NULL};

link_node_t C = {"liu", NULL};

link_node_t D = {"wang", NULL};

A.next = &B;

B.next = &C;

C.next = &D;

h.next = &A;

link_node_t *p;

p = &h;

//輸出每個節點

while(p->next != NULL)

{

p = p->next;

printf("%s\n", p->name);

}

}

用帶頭結點的單向鏈表存儲n個學生成績 ,成績由鍵盤輸入,輸入<=0 時結束

////

#include <stdio.h>

#include <stdlib.h>

typedef struct node_t

{

int score;              //數據域

struct node_t *next;   //指針域,通過指針域可以找到下一個節點

}link_node_t;

int main()

{

int s;

//創建一個頭結點

link_node_t *p, *q, *h;//p 是新節點   q 是最后一個節點    h是第一個節點

p = malloc(sizeof(link_node_t));

p->next = NULL;

q = p;

h = p;

while(1)

{

scanf("%d", &s);

if(s <= 0)

break;

p = malloc(sizeof(link_node_t));

p->score = s;

p->next = NULL;

q->next = p;

q = p;

}

p = h;

while(p->next != NULL)

{

p = p->next;

printf("%d\n", p->score);

}

//再寫個釋放程序

while(h != NULL)

{

p = h->next;

free(h);

h = p;

}

}

鏈表有這些操作

#include <stdio.h>

#include <stdlib.h>

typedef struct node_t

{

int data;              //數據域

struct node_t *next;   //指針域

}link_node_t, *link_list_t;

//1 創建空鏈表(帶頭結點的單向鏈表)

link_node_t *CreateEmptyLinklist()

{

link_node_t *p = malloc(sizeof(link_node_t));

p->next = NULL;

return p;

}

//2 判斷表是否為空           1 空    0 非空

int EmptyLinklist(link_node_t *p)

{

if(p->next == NULL)

return 1;

else

return 0;

}

//2.5 求鏈表長度

int LengthLinklist(link_node_t *p)

{

int i = 0;

while(p->next != NULL)

{

i++;

p = p->next;

}

return i;

}

//3 查找某個位置元素的值

int GetLinklist(link_node_t *p, int pos)

{

int i;

if(pos > LengthLinklist(p) + 1 || pos < 1)

return -1;

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

{

p = p->next;

}

return p->data;

}

//4 插入元素

int InsertLinklist(link_node_t *p, int pos, int x)

{

int i;

link_node_t *q;

if(pos > LengthLinklist(p) + 1 || pos < 1)

return -1;

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

{

p = p->next;

}

q = malloc(sizeof(link_node_t));

q->data = x;

q->next = p->next;

p->next = q;

return 0;

}

//5 刪除元素

int DeleteLinklist(link_node_t *p, int pos)

{

int i;

link_node_t *q;

if(pos > LengthLinklist(p) + 1 || pos < 1)

return -1;

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

{

p = p->next;

}

q = p->next;

p->next = q->next;

free(q);

return 0;

}

//6 將鏈表倒置(逆轉)

void ReverseLinklist(link_node_t *h)

{

link_node_t *p, *q;

p = h->next;

h->next = NULL;

while(p != NULL)

{

q = p;

p = p->next;

q->next = h->next;

h->next = q;

}

return;

}

//7 輸出鏈表中所有元素

void PrintLinklist(link_node_t *p)

{

while(p->next != NULL)

{

p = p->next;

printf("%d ", p->data);

}

printf("\n");

}

int main()

{

link_node_t *h = CreateEmptyLinklist();

printf("%d\n", InsertLinklist(h, 1, 40));

InsertLinklist(h, 1, 20);

InsertLinklist(h, 2, 30);

PrintLinklist(h); //20 30 40

InsertLinklist(h, 1, 10);

PrintLinklist(h); //10 20 30 40

DeleteLinklist(h, 3);

PrintLinklist(h); //10 20 40

ReverseLinklist(h);

PrintLinklist(h); //40 20 10

}

上一篇:ARM異常處理設置

下一篇:STM32的IWDG

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 故乡之恋简谱| 鲁班书咒语大全| 威尼斯的资料| 三级女友| kaori全部av作品大全| 一键换装app永久免费| 王紫瑄| cctv17节目表今天| 罗中立的《父亲》详案| 男操女视频免费| 不回微信判30年图片| 彭丹三级裸奶视频| 最美表演| 电影《皮囊》| 欠工资不给打什么电话能最快处理| 范海辛电影原声在线观看免费| 甜蜜监狱| 保坂尚辉| 视频999| 秀人网门户网免费| 《暗格里的秘密》免费观看| 绿雾影视| 头像图片2024最新款女| 恶魔地狱| 《牵牛花》阅读答案| 热情电影| 美丽交易| 石灰和碱的6种配方| 周记作文| 李采禫的电影| 扭曲的欲望| 罗志祥小猪视频app全部| 新上映电影| 陈一龙是哪部电视剧| 视频999| 欧美成熟| 感谢有你简谱| 孤独感拉满的头像| 林诗雅电影| 大园桃子| 邓为个人资料简介及家世|