欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言深入探索之單鏈表與typedef的用法

 更新時(shí)間:2022年05月18日 09:41:38   作者:對(duì)象new不出來(lái)  
typedef為C語(yǔ)言的關(guān)鍵字,作用是為一種數(shù)據(jù)類型定義一個(gè)新名字,單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C語(yǔ)言,我們就要奠定好這塊基石!接下來(lái)就和我一起學(xué)習(xí)吧

前言

昨天博主去本站問(wèn)答貼子逛了逛,然后發(fā)現(xiàn)了好多關(guān)于數(shù)據(jù)結(jié)構(gòu)線性表,具體來(lái)說(shuō)是單鏈表的問(wèn)題。有的是沒有一點(diǎn)思路,無(wú)從下手;有的是看不懂代碼,不理解關(guān)鍵字以及被形參的形式氣的不行,我總結(jié)了一下常見問(wèn)題來(lái)給大家?guī)?lái)干貨,到后面還有簡(jiǎn)單案例來(lái)鞏固知識(shí),弄透一題勝無(wú)腦刷百題,接下來(lái)是正文內(nèi)容。

詳解typedef關(guān)鍵字

含義

C語(yǔ)言允許用戶使用 typedef 關(guān)鍵字來(lái)定義自己習(xí)慣的數(shù)據(jù)類型名稱,來(lái)替代系統(tǒng)默認(rèn)的基本類型名稱、數(shù)組類型名稱、指針類型名稱與用戶自定義的結(jié)構(gòu)型名稱、共用型名稱、枚舉型名稱等。一旦用戶在程序中定義了自己的數(shù)據(jù)類型名稱,就可以在該程序中用自己的數(shù)據(jù)類型名稱來(lái)定義變量的類型、數(shù)組的類型、指針變量的類型與函數(shù)的類型等。

具體使用

單鏈表結(jié)點(diǎn)示例:

typedef struct node
{
	int data;//數(shù)據(jù)域
	struct node * next;//指針域
}Lnode, * SLinkList;

這里我們創(chuàng)建了 node 結(jié)構(gòu)體,結(jié)構(gòu)體里面包含了 整型數(shù)據(jù)data,指針next 指向下一個(gè)結(jié)點(diǎn)的地址??梢钥吹较旅娲罄ㄌ?hào)外有 Lnode和*SLinkList。他的意思就是我們給node 起了一個(gè)別名叫Lnode,Lnode具有和node相同的結(jié)構(gòu),struct node n1與Lnode n1 效果完全相同;同時(shí)C語(yǔ)言還允許在結(jié)構(gòu)中包含指向它自己的指針,即 SLinkList L 等價(jià)于 struct node* L 或者 Lnode *L;

詳解單鏈表參數(shù)形式

指針知識(shí)補(bǔ)充

示例:

//1、
int* getValue1(int *&L)
{
	int a = 10;
	L = &a;
	return L;
}
//2、
int* getValue2(int *L)
{
	int a = 10;
	L = &a;
	return L;
}
int main()
{
	int* ptr = (int*)malloc(sizeof(int) * 4);
	getValue1(ptr);
    getValue2(ptr);
	cout << *ptr << endl;
}

我在主函數(shù)中為指針ptr動(dòng)態(tài)分配了內(nèi)存空間,大小為4*4字節(jié),不理解的可以參考我的這篇博文詳解數(shù)據(jù)結(jié)構(gòu)線性表里面的動(dòng)態(tài)分布內(nèi)存函數(shù)malloc;然后將地址傳遞到上面兩個(gè)函數(shù)里面去,輸出getValue1 的*ptr 結(jié)果是10,但是getValue2 中*ptr 的結(jié)果卻是亂碼。那么原因很明顯,就是參數(shù) int *&L和 int *L的區(qū)別了。這個(gè)函數(shù)的返回值是一個(gè)地址,然而在棧區(qū)開辟的數(shù)據(jù),在函數(shù)調(diào)用結(jié)束后就會(huì)被編譯器自動(dòng)釋放掉,從而返回的地址不會(huì)是&a,因此僅僅使用地址傳遞是不行的。那么加上&為什么就可以了呢,這是因?yàn)槲覀兊哪康氖歉淖儌魅胫羔標(biāo)赶虻牡刂?,第一種只能改變?cè)摰刂穼?duì)應(yīng)的數(shù)值,第二種可以從本質(zhì)上更改地址,所以能得到 &a 從而*ptr結(jié)果為10。

單鏈表形參詳解

示例:

typedef struct node
{
	int data;//數(shù)據(jù)域
	struct node * next;//指針域
}Lnode, * SLinkList;
SLinkList Init_List(Lnode *&L)
{
	L = (SLinkList)malloc(sizeof(Lnode));
	L->next = NULL;
	return L;
}

同樣的,根據(jù)我前面講的知識(shí),我定義了一個(gè)SLinkList 指針型的初始化鏈表函數(shù) Init_List(),傳入的是結(jié)構(gòu)體指針變量L,接下來(lái)為L(zhǎng)分配內(nèi)存空間,這里sizeof(Lnode)是計(jì)算了結(jié)構(gòu)體Lnode所占內(nèi)存大小并將此內(nèi)存分配給L,接下來(lái)讓初始化L,讓其指針域?yàn)榭铡?shí)際上L->data =NULL,L 就是單鏈表中的頭結(jié)點(diǎn)。這段代碼是沒有問(wèn)題的,但是如果把形參中的Lnode *&L,改為L(zhǎng)node *L,那么編譯器必然會(huì)提示我們,取消對(duì)NULL指針的使用,這就是為什么我們要加上&的原因,不加&返回的不是我們分配的指針變量L的地址,那這樣我們的初始化毫無(wú)意義,雖然不報(bào)錯(cuò),但是毫無(wú)作用。所以提醒你們寫數(shù)據(jù)結(jié)構(gòu)的時(shí)候記住這個(gè)小細(xì)節(jié),很重要的!

單鏈表實(shí)戰(zhàn)案例

完整代碼實(shí)現(xiàn)

#include<iostream>
using namespace std;
#define SIZE 10
typedef struct node
{
	int data;//數(shù)據(jù)域
	struct node * next;//指針域
 
}Lnode, * SLinkList;
SLinkList Init_List(Lnode *&L)
{
	L = (SLinkList)malloc(sizeof(Lnode));
	L->next = NULL;
	return L;
}
SLinkList Creat_List(Lnode* &L,int n)//頭插建表
{
	srand((unsigned int)time(NULL));
	SLinkList p = L;
	for (int i = 0; i < n; i++)
	{
		int e = rand() % 20 + 1;
		SLinkList s = (SLinkList)malloc(sizeof(Lnode));
		s->next = p->next;
		p->next = s;
		s->data = e;
	}
	return L;
}
int count_List(Lnode *& L)
{
	int count = 0;
	SLinkList p = L->next;
	while (p)
	{
		count++;
		p = p->next;
	}
	return count;
}
int find_List(SLinkList L,int v)
{
	SLinkList p = L->next;
	int i = 1;
	while (i < v && p->next)
	{
		p = p->next;
		i++;
	}
	return p->data;
}
void display_List(SLinkList L)
{
	SLinkList p = L->next;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	int n = rand()%5 + 5, count = 0, v = 0;
	SLinkList L;
	L = Init_List(L);
	cout << "隨機(jī)插入元素完成:"<<endl;
	L = Creat_List(L,n);
	count = count_List(L);
	cout << "單鏈表長(zhǎng)度為:" << count << endl;
	cout << "遍歷單鏈表結(jié)果為:" << endl;
	display_List(L);
	cout << endl;
	cout << "要查找元素的位置為:"; cin >> v;
	int value = find_List(L, v);
	cout << "查找結(jié)果為:" << value << endl;
}

詳解頭插建表

把頭插建表方法復(fù)制過(guò)來(lái)

SLinkList Creat_List(Lnode* &L,int n)//頭插建表
{
	srand((unsigned int)time(NULL));
	SLinkList p = L;
	for (int i = 0; i < n; i++)
	{
		int e = rand() % 20 + 1;
		SLinkList s = (SLinkList)malloc(sizeof(Lnode));
		s->next = p->next;
		p->next = s;
		s->data = e;
	}
	return L;
}

這里不用管srand((unsigned int)time(NULL));這段代碼是為了產(chǎn)生不同隨機(jī)數(shù),和我講的內(nèi)容沒有什么聯(lián)系;往下看,創(chuàng)建建構(gòu)體指針變量p并把p設(shè)置為頭指針:L是頭結(jié)點(diǎn),p=L,p指向鏈表第一個(gè)帶值結(jié)點(diǎn)。進(jìn)入循環(huán)語(yǔ)句,循環(huán)語(yǔ)句n我會(huì)利用隨機(jī)數(shù)產(chǎn)生;e是1~20范圍內(nèi)隨機(jī)的一個(gè)數(shù)值,結(jié)構(gòu)體指針變量s被動(dòng)態(tài)分配內(nèi)存空間s->next = p>next; p->next = s;s->data = e;這三行代碼是頭插法的核心。首先待插入原色s指針指向頭結(jié)點(diǎn)指向的結(jié)點(diǎn),然后頭指針指向s,這樣鏈表的鏈就連好了,最后給s的數(shù)據(jù)域賦值為e,執(zhí)行循環(huán)語(yǔ)句,這樣新插入的結(jié)點(diǎn)都會(huì)在上一個(gè)插入結(jié)點(diǎn)的前面,這就是頭插法的全部過(guò)程。

int count_List(Lnode *& L); 方法對(duì)應(yīng)第一問(wèn);

int find_List(SLinkList L,int v);方法對(duì)應(yīng)第二問(wèn);

相信認(rèn)真看完這篇博文的你可以很好理解上面兩種方法的含義以及整個(gè)源碼表達(dá)的意思,最后附上運(yùn)行效果截圖:

運(yùn)行效果

到此這篇關(guān)于C語(yǔ)言深入探索之單鏈表與typedef的用法的文章就介紹到這了,更多相關(guān)C語(yǔ)言單鏈表與typedef內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 聊聊C語(yǔ)言中sizeof運(yùn)算符的一個(gè)陷阱

    聊聊C語(yǔ)言中sizeof運(yùn)算符的一個(gè)陷阱

    在C語(yǔ)言中,sizeof()是一個(gè)判斷數(shù)據(jù)類型或者表達(dá)式長(zhǎng)度的運(yùn)算符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中sizeof運(yùn)算符的一個(gè)陷阱的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • C/CPP運(yùn)算優(yōu)先級(jí)的坑及解決

    C/CPP運(yùn)算優(yōu)先級(jí)的坑及解決

    這篇文章主要介紹了C/CPP運(yùn)算優(yōu)先級(jí)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • c語(yǔ)言/c++溢出問(wèn)題淺談

    c語(yǔ)言/c++溢出問(wèn)題淺談

    這篇文章主要給大家介紹了關(guān)于c語(yǔ)言/c++溢出問(wèn)題的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • shared_ptr線程安全性全面分析

    shared_ptr線程安全性全面分析

    正如boost文檔所宣稱的,boost為shared_ptr提供了與內(nèi)置類型同級(jí)別的線程安全性。這包括:1. 同一個(gè)shared_ptr對(duì)象可以被多線程同時(shí)讀取。2. 不同的shared_ptr對(duì)象可以被多線程同時(shí)修改成
    2013-09-09
  • C++實(shí)現(xiàn)LeetCode(127.詞語(yǔ)階梯)

    C++實(shí)現(xiàn)LeetCode(127.詞語(yǔ)階梯)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(127.詞語(yǔ)階梯),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++學(xué)習(xí)之IO流(輸入輸出流)詳解

    C++學(xué)習(xí)之IO流(輸入輸出流)詳解

    流是一種抽象概念,它代表了數(shù)據(jù)的無(wú)結(jié)構(gòu)化傳遞。而用來(lái)進(jìn)行輸入輸出操作的流就稱為IO流。這篇文章主要為大家介紹了C++中IO流的使用詳解,需要的朋友可以參考一下
    2021-12-12
  • C語(yǔ)言面試C++二維數(shù)組中的查找示例

    C語(yǔ)言面試C++二維數(shù)組中的查找示例

    這篇文章主要介紹了C語(yǔ)言面試C++二維數(shù)組中的查找示例,文中給出基本能拿下面試官的操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • C語(yǔ)言中的多行輸入問(wèn)題及說(shuō)明

    C語(yǔ)言中的多行輸入問(wèn)題及說(shuō)明

    這篇文章主要介紹了C語(yǔ)言中的多行輸入問(wèn)題及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++實(shí)現(xiàn)雙向鏈表代碼分析

    C++實(shí)現(xiàn)雙向鏈表代碼分析

    這篇文章主要介紹了C++實(shí)現(xiàn)雙向鏈表代碼分析,前面文章分析了單向鏈表,這篇文章就來(lái)給大家分享雙鏈表的實(shí)現(xiàn)吧,需要的朋友可以參考一下
    2022-03-03
  • C++利用SQLite實(shí)現(xiàn)命令行工具

    C++利用SQLite實(shí)現(xiàn)命令行工具

    這篇文章主要為大家詳細(xì)介紹了一個(gè)基于 C++、SQLite 和 Boost 庫(kù)的簡(jiǎn)單交互式數(shù)據(jù)庫(kù)操作 Shell,該 Shell 允許用戶通過(guò)命令行輸入執(zhí)行各種數(shù)據(jù)庫(kù)操作,感興趣的可以了解下
    2023-11-11

最新評(píng)論