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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2021-4-8 【链表】【】

發布時間:2024/1/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021-4-8 【链表】【】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

何為鏈表

我們知道,一般用數組存放一組數據時,必須事先定義固定的長度(即元素的個數)。這在某些問題的解決中,并不是特別的適用。例如:記錄不同的班級的學生數據時,由于各班人數不同,會出現開辟過大的數組導致內存浪費,開辟過小的數組導致數組元素不夠用的情況。而鏈表可以根據需要動態開辟內存單元,是一種常見的重要數據結構。

鏈表如同鐵鏈一樣,一環扣一環,中間是不能斷開的。打個通俗的比喻:幼兒園的老師帶領小朋友出來散步,老師牽著第一個小朋友的手,第一個小朋友牽著第二個小朋友的手…這就是一個“鏈”,最后一個小朋友的手是空的。

老師即“頭指針” 變量,以Head表示,它存放一個地址,鏈表中每一個元素稱為“結點”,每個結點都應該包括兩個部分:一為實際元素值,一為下一結點的地址。

最后一個元素不指向其他元素,它被稱為“表尾”,以“NULL”表示,“NULL”在C++語言里指向“空指針”。

很顯然,這種鏈表的數據結構,必須要用指針變量才能實現。

簡單靜態鏈表

下面的代碼是一個簡單的靜態鏈表,它由3個學生的數據(學號,成績)的結點組成。請考慮:(1)head的作用(2)p的作用

//簡單靜態鏈表 #include<iostream> using namespace std;struct student {long num;float score;struct student *next; };int main() {struct student a,b,c,*head,*p;a.num=34341; a.score=81.5;b.num=34341; b.score=81.5;c.num=34341; c.score=81.5;head=&a;a.next=&b;b.next=&c;c.next=NULL;p=head;do{cout<<p->num<<" "<<p->score<<endl;p=p->next;}while(p!=NULL);getchar(); }

處理動態鏈表的函數

1.malloc
函數原型為

void *malloc(unsigned int size);

作用是在內存的動態存儲區中分配一個長度為size的連續空間。此函數返回的是一個指向分配域起始地址的指針,如果此函數未能成功地執行(如內存空間不足),則返回空指針(NULL)。

2.calloc
函數原型為

void *calloc(unsigned n,unsigned size);

作用是在內存的動態存儲區中分配n個長度為size的連續空間。函數返回一個指向分配域起始地址的指針;如果分配不成功,則返回NULL。

3.free()
函數原型為

void free(void *p);

作用是釋放由p指向的內存區,使這部分內存區能被其他變量使用。

動態鏈表的準備工作

一個完善的動態鏈表程序應該具有以下基本功能:建立鏈表,插入結點,刪除結點,打印鏈表,釋放鏈表等。擴展的動態鏈表程序還可能有獲得鏈表長度,獲得當前結點,查找結點位置,連續兩個鏈表,比較兩個鏈表等功能。下面將逐個實現其功能代碼。

為了程序的易讀性和可擴展性,有時需要在程序開頭先進行預定義處理,請務必領會下面的代碼用意,否則將影響對以后代碼的理解

#include<stdlib.h> #include<stdio.h> typedef int ElemType; //以 ElemType 代表 int 型數據 typedef struct List *link; //以 link 代表鏈表指針 typedef struct List Lnode; //以 Lnode 代表鏈表結點struct List {ElemType data; //此處僅以一個整型變量為例struct List *next; };

主函數的建立:下面的主函數只是一個簡單調用各功能的示范例子,讀者可自行修改和添加代碼以完成更復雜的任務。請根據主函數的代碼考慮各功能子函數的原型應如何建立。

int main() {int l;link head1;link head2;head1=create(head1); //建立鏈表1head2=create(head2); //建立鏈表2 connect(head1,head2); //連接兩個鏈表head1=insert(head1,888,5); //在位置5處插入元素888head1=del(head1,3); //刪除一個結點display(head1); //打印鏈表printf("\n lenth is %d\n",lenth(head1)); //打印鏈表長度printf("\n get is %d\n",get(head1,3)); //獲得當前結點值printf("\n locate 12 is %d",lenth(head1,12)); //查找元素12所在的位置head=setnull(head); //釋放鏈表 }

鏈表的建立

由主函數調用create()函數的方式可知,該函數應該返回一個結點的指針,輸入的參數也應該是一個結點指針,參考代碼如下:

link create(link Head) {ElemType newData;link NewPoint;//先創建一個結點Head=(link)malloc(sizeof(Lnoed));printf("please input number :\n");scanf("%d",&newData);Head->data=newData; //結點賦值Head->next=NULL; //結點指向空地址while(1) //繼續添加結點{NewPoint=(link)malloc(sizeof(Lnode));//開辟一個結點空間if(NewPoint==NULL){//如果開辟空間失敗,則返回break;//此判斷語句在某些類型的競賽中用處不大,可忽略}printf("please input number : input '-1' means exit\n");scanf("%d",&newData);if(newData==-1){ //輸入-1則添加結點結束并返回headreturn Head;}NewPoint->data=newData;NewPoint->next=Head;Head=NewPoint;}return Head; }

鏈表的顯示

該子函數無返回值,輸入參數為鏈表的頭指針,請考慮:指針p的作用是什么?如果不用指針p,直接用Head這個指針會出現什么后果?

void display(link Head) {link p;p=Head;if(p==NULL)printf("\nList is empty\n");elsedo{printf("%d",p->data);p=p->next;}while(p!=NULL); }

結點的插入

link insert(link Head,ElemType x,int i) {link NewPoint,p=Head;int j=1;NewPoint=(link)malloc(sizeof(Lnode));NewPoint->data=x;if(i==1){NewPoint->next=Head;Head=NewPoint;}else{while(j<i-1&&p->next!=NULL){p=p->NULL;j++;}if(j==i-1){NewPoint->next=p->next;p->next=NewPoint;}elseprintf("insert is Failure,i is not right!!");}return Head; }

總結

以上是生活随笔為你收集整理的2021-4-8 【链表】【】的全部內容,希望文章能夠幫你解決所遇到的問題。

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