日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构:链表(c语言)

發布時間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:链表(c语言) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.鏈表簡介:
鏈表和數組一樣,都是存儲數據,鏈表是非連續,非順序的存儲結構
鏈表是靈活的內存動態管理(隨機分配空間),刪除創建結點非常方便
鏈表組成:由一系列結點組成
鏈表結點:實際上是結構體變量

typedef struct LINKNODE {int data;// 數據域struct _LINKNODE *next;// 指針域 }Link_Node;

鏈表結點包含兩個部分:
1.存儲數據元素的數據域
2.存儲下一個結點地址的指針域

2.鏈表和數組的區別
數組:一次性分配連續的存儲區域
優點:隨機訪問元素效率搞
缺點:開辟內存過大時,易分配失敗;插入和刪除效率低下
鏈表:無需一次性分配連續的存儲空間,只需要分配n塊結點存儲區域,通過指針建立聯系
優點:不需要一次性分配連續的存儲區域;刪除和插入效率高
缺點:隨機訪問元素效率低

3.靜態鏈表:是在初始化的時候就分配好足夠的內存空間,存儲空間是靜態的,分配在棧上,模擬數組實現的,是順序的存儲結構

#include<stdio.h> #include<string.h> #include<stdlib.h>typedef struct LINKNODE{int data;struct LINKNODE *next; }Link_Node;int main() {Link_Node Node1={1,NULL};Link_Node Node2={2,NULL};Link_Node Node3={3,NULL};Node1.next=&Node2;Node2.next=&Node3;Node3.next=NULL;Link_Node *head=&Node1;while(head!=NULL){printf("data:[%d]\n",head->data);head=head->next;}return 0; }

4.動態鏈表

#include<stdio.h> #include<string.h> #include<stdlib.h>typedef struct LINKNODE{int data;struct LINKNODE *next; }Link_Node;int main() {Link_Node *Node1=(Link_Node *)malloc(sizeof(Link_Node));Link_Node *Node2=(Link_Node *)malloc(sizeof(Link_Node));Link_Node *Node3=(Link_Node *)malloc(sizeof(Link_Node));Node1->data=1;Node2->data=2;Node3->data=3;Node1->next=Node2;Node2->next=Node3;Node3->next=NULL;Link_Node *head=&Node1;while(head!=NULL){printf("data:[%d]\n",head->data);head=head->next;}return 0; }

5.帶頭鏈表和不帶頭鏈表
帶頭鏈表:固定一個結點作為頭結點,不關心數據域,起一個標志位的作用,鏈表結點如何變化,此頭結點固定不變
不帶頭結點:頭結點不固定,所有結點都可以作為頭,可以隨機變化
6.鏈表按照類型又劃分為:單向鏈表,雙向鏈表,循環鏈表
7.鏈表的基本操作(基于單向鏈表)
1.創建鏈表結點域

typedef struct LINKNODE{int data;struct LINKNODE *next; }Link_Node;

2.創建鏈表

Link_Node *Init_Link_Node() {Link_Node *cur=NULL;//保存上一個結點 Link_Node *pNew=NULL;//輔助指針 Link_Node *head=NULL;//固定為頭結點 //創建頭結點 pNew=(Link_Node)malloc(sizeof(Link_Node));pNew->data=-1;pNew->next=NULL;head=pNew;cur=pNew;//head作為頭結點,cur保存結點 //創建循環結點 int dataid; while(1){printf("請輸入data id編號:");scanf("%d",&dataid);if(dataid<=0) break;else{//創建新結點 pNew=(Link_Node)malloc(sizeof(Link_Node));pNew->data=dataid;cur->next=pNew;//頭結點(head)指向新結點 pNew->next=NULL;cur=pNew;//指針下移 }}return head; }

3.遍歷鏈表

int Print_Link_Node(Link_Node *head) {if(head==NULL) return -1;else{Link_Node *cur=head->next;printf("head->");while(cur!=NULL){printf("%d->",cur->data);cur=cur->next;} printf("NULL\n");//cur指向了NULL } }

4.在頭部插入結點

void Init_Head_Link_Node(Link_Node *head,int dataid) {if(head==NULL) return -1;else{Link_Node *cur=head->next;//保存第一個有效結點 Link_Node *pNew=(Link_Node *)malloc(sizeof(Link_Node));pNew->data=dataid;//建立關系 head->next=pNew;pNew->next=cur;} }

5.尾部插入

void Init_Tail_Link_Node(Link_Node *head,int dataid) {if(head==NULL) return -1;else{Link_Node *cur=head;//保存結點,獲取最后一個結點 while(cur->next!=NULL){cur=cur->next;//結點后移 }Link_Node *pNew=(Link_Node *)malloc(sizeof(Link_Node));pNew->data=dataid;cur->next=pNew;pNew->next=NULL; } }

6.指定位置

//找到data為num的前面插入,找不到就尾插 void Init_Insert_Link_Node(Link_Node *head,int num,int dataid) {if(head==NULL){return;}//一定記得判斷headLink_Node *cur=head->next;//cur為第一個有效結點 Link_Node *pre=head;//pre保存cur的前一個結點 while(cur!=NULL){//此循環體是查找插入位置,找到則跳出循環 if(cur->next==num){break;} pre=pre->next; cur=cur->next;} Link_Node *pNew=(Link_Node *)malloc(sizeof(Link_Node));pNew->data=dataid;pre->next=pNew;pNew->next=cur; }

7.刪除指定data第一個值

void Del_Link_Node(Link_Node *head,int dataid) {if(head==NULL) return;Link_Node *cur=head->next;Link_Node *pre=head;int flag=0;while(cur!=NULL){if(cur->data==dataid){flag=1;pre->next=cur->next;free(cur);cur=NULL;break;}pre=pre->next;cur=cur->next;} if(flag==0){printf("沒有找到%d的結點\n",dataid);} }

8.釋放鏈表

void Destroy_link_Node(Link_Node *head) {link_Node *cur=head;while(cur->next!=NULL){head=head->next;free(cur);cur->next=NULL;cur=head;}printf("鏈表清空\n"); }

9.main函數

int main(int argc,char argv[]) {//創建鏈表 Link_Node *headLink_Node=Init_Link_Node();Print_Link_Node(headLink_Node);//頭插法Init_Head_Link_Node(headLink_Node,1111);Print_Link_Node(headLink_Node);//尾插法Init_Tail_Link_Node(headLink_Node,2222); Print_Link_Node(headLink_Node);//查找插入Init_Insert_Link_Node(headLink_Node,4,3333);Print_Link_Node(headLink_Node);//刪除Del_Link_Node(headLink_Node,2);Print_Link_Node(headLink_Node);//清空鏈表Destroy_Link_Node(headLink_Node); }

總結

以上是生活随笔為你收集整理的数据结构:链表(c语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。