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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

2021-4-8 【链表】【】

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

何為鏈表

我們知道,一般用數(shù)組存放一組數(shù)據(jù)時(shí),必須事先定義固定的長(zhǎng)度(即元素的個(gè)數(shù))。這在某些問(wèn)題的解決中,并不是特別的適用。例如:記錄不同的班級(jí)的學(xué)生數(shù)據(jù)時(shí),由于各班人數(shù)不同,會(huì)出現(xiàn)開(kāi)辟過(guò)大的數(shù)組導(dǎo)致內(nèi)存浪費(fèi),開(kāi)辟過(guò)小的數(shù)組導(dǎo)致數(shù)組元素不夠用的情況。而鏈表可以根據(jù)需要?jiǎng)討B(tài)開(kāi)辟內(nèi)存單元,是一種常見(jiàn)的重要數(shù)據(jù)結(jié)構(gòu)。

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

老師即“頭指針” 變量,以Head表示,它存放一個(gè)地址,鏈表中每一個(gè)元素稱為“結(jié)點(diǎn)”,每個(gè)結(jié)點(diǎn)都應(yīng)該包括兩個(gè)部分:一為實(shí)際元素值,一為下一結(jié)點(diǎn)的地址。

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

很顯然,這種鏈表的數(shù)據(jù)結(jié)構(gòu),必須要用指針變量才能實(shí)現(xiàn)。

簡(jiǎn)單靜態(tài)鏈表

下面的代碼是一個(gè)簡(jiǎn)單的靜態(tài)鏈表,它由3個(gè)學(xué)生的數(shù)據(jù)(學(xué)號(hào),成績(jī))的結(jié)點(diǎn)組成。請(qǐng)考慮:(1)head的作用(2)p的作用

//簡(jiǎn)單靜態(tài)鏈表 #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(); }

處理動(dòng)態(tài)鏈表的函數(shù)

1.malloc
函數(shù)原型為

void *malloc(unsigned int size);

作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長(zhǎng)度為size的連續(xù)空間。此函數(shù)返回的是一個(gè)指向分配域起始地址的指針,如果此函數(shù)未能成功地執(zhí)行(如內(nèi)存空間不足),則返回空指針(NULL)。

2.calloc
函數(shù)原型為

void *calloc(unsigned n,unsigned size);

作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配n個(gè)長(zhǎng)度為size的連續(xù)空間。函數(shù)返回一個(gè)指向分配域起始地址的指針;如果分配不成功,則返回NULL。

3.free()
函數(shù)原型為

void free(void *p);

作用是釋放由p指向的內(nèi)存區(qū),使這部分內(nèi)存區(qū)能被其他變量使用。

動(dòng)態(tài)鏈表的準(zhǔn)備工作

一個(gè)完善的動(dòng)態(tài)鏈表程序應(yīng)該具有以下基本功能:建立鏈表,插入結(jié)點(diǎn),刪除結(jié)點(diǎn),打印鏈表,釋放鏈表等。擴(kuò)展的動(dòng)態(tài)鏈表程序還可能有獲得鏈表長(zhǎng)度,獲得當(dāng)前結(jié)點(diǎn),查找結(jié)點(diǎn)位置,連續(xù)兩個(gè)鏈表,比較兩個(gè)鏈表等功能。下面將逐個(gè)實(shí)現(xiàn)其功能代碼。

為了程序的易讀性和可擴(kuò)展性,有時(shí)需要在程序開(kāi)頭先進(jìn)行預(yù)定義處理,請(qǐng)務(wù)必領(lǐng)會(huì)下面的代碼用意,否則將影響對(duì)以后代碼的理解

#include<stdlib.h> #include<stdio.h> typedef int ElemType; //以 ElemType 代表 int 型數(shù)據(jù) typedef struct List *link; //以 link 代表鏈表指針 typedef struct List Lnode; //以 Lnode 代表鏈表結(jié)點(diǎn)struct List {ElemType data; //此處僅以一個(gè)整型變量為例struct List *next; };

主函數(shù)的建立:下面的主函數(shù)只是一個(gè)簡(jiǎn)單調(diào)用各功能的示范例子,讀者可自行修改和添加代碼以完成更復(fù)雜的任務(wù)。請(qǐng)根據(jù)主函數(shù)的代碼考慮各功能子函數(shù)的原型應(yīng)如何建立。

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

鏈表的建立

由主函數(shù)調(diào)用create()函數(shù)的方式可知,該函數(shù)應(yīng)該返回一個(gè)結(jié)點(diǎn)的指針,輸入的參數(shù)也應(yīng)該是一個(gè)結(jié)點(diǎn)指針,參考代碼如下:

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

鏈表的顯示

該子函數(shù)無(wú)返回值,輸入?yún)?shù)為鏈表的頭指針,請(qǐng)考慮:指針p的作用是什么?如果不用指針p,直接用Head這個(gè)指針會(huì)出現(xiàn)什么后果?

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); }

結(jié)點(diǎn)的插入

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; }

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。