最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

詳解typedef關鍵字

含義

C語言允許用戶使用 typedef 關鍵字來定義自己習慣的數(shù)據類型名稱,來替代系統(tǒng)默認的基本類型名稱、數(shù)組類型名稱、指針類型名稱與用戶自定義的結構型名稱、共用型名稱、枚舉型名稱等。一旦用戶在程序中定義了自己的數(shù)據類型名稱,就可以在該程序中用自己的數(shù)據類型名稱來定義變量的類型、數(shù)組的類型、指針變量的類型與函數(shù)的類型等。

具體使用

單鏈表結點示例:

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

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

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

指針知識補充

示例:

//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動態(tài)分配了內存空間,大小為4*4字節(jié),不理解的可以參考我的這篇博文詳解數(shù)據結構線性表里面的動態(tài)分布內存函數(shù)malloc;然后將地址傳遞到上面兩個函數(shù)里面去,輸出getValue1 的*ptr 結果是10,但是getValue2 中*ptr 的結果卻是亂碼。那么原因很明顯,就是參數(shù) int *&L和 int *L的區(qū)別了。這個函數(shù)的返回值是一個地址,然而在棧區(qū)開辟的數(shù)據,在函數(shù)調用結束后就會被編譯器自動釋放掉,從而返回的地址不會是&a,因此僅僅使用地址傳遞是不行的。那么加上&為什么就可以了呢,這是因為我們的目的是改變傳入指針所指向的地址,第一種只能改變該地址對應的數(shù)值,第二種可以從本質上更改地址,所以能得到 &a 從而*ptr結果為10。

單鏈表形參詳解

示例:

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

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

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

完整代碼實現(xiàn)

#include<iostream>
using namespace std;
#define SIZE 10
typedef struct node
{
	int data;//數(shù)據域
	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 << "隨機插入元素完成:"<<endl;
	L = Creat_List(L,n);
	count = count_List(L);
	cout << "單鏈表長度為:" << count << endl;
	cout << "遍歷單鏈表結果為:" << endl;
	display_List(L);
	cout << endl;
	cout << "要查找元素的位置為:"; cin >> v;
	int value = find_List(L, v);
	cout << "查找結果為:" << value << endl;
}

詳解頭插建表

把頭插建表方法復制過來

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

int count_List(Lnode *& L); 方法對應第一問;

int find_List(SLinkList L,int v);方法對應第二問;

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

運行效果

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

相關文章

  • MFC框架之OnIdle案例詳解

    MFC框架之OnIdle案例詳解

    這篇文章主要介紹了MFC框架之OnIdle案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C++中的STL中map用法詳解(零基礎入門)

    C++中的STL中map用法詳解(零基礎入門)

    map在編程中是經常使用的一個容器,本文來講解一下STL中的map,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++代碼實現(xiàn)雙向鏈表

    C++代碼實現(xiàn)雙向鏈表

    這篇文章主要為大家詳細介紹了C++代碼實現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++實現(xiàn)掃雷經典小游戲

    C++實現(xiàn)掃雷經典小游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)掃雷經典小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++使用遞歸和非遞歸算法實現(xiàn)的二叉樹葉子節(jié)點個數(shù)計算方法

    C++使用遞歸和非遞歸算法實現(xiàn)的二叉樹葉子節(jié)點個數(shù)計算方法

    這篇文章主要介紹了C++使用遞歸和非遞歸算法實現(xiàn)的二叉樹葉子節(jié)點個數(shù)計算方法,涉及C++二叉樹的定義、遍歷、統(tǒng)計相關操作技巧,需要的朋友可以參考下
    2017-05-05
  • 如何在C++中建立一個順序表

    如何在C++中建立一個順序表

    在使用順序表之前,首先創(chuàng)建一個空的順序表,也就是初始化順序表。這里,在程序中只需設置順序表的結點數(shù)量ListLen為0即可。這樣,后面需要添加的數(shù)據元素將從順序表的第一個位置存儲
    2013-10-10
  • C語言遞歸應用實現(xiàn)掃雷游戲

    C語言遞歸應用實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了C語言遞歸應用實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言簡明清晰講解結構體

    C語言簡明清晰講解結構體

    C語言結構體(Struct)從本質上講是一種自定義的數(shù)據類型,只不過這種數(shù)據類型比較復雜,是由 int、char、float 等基本類型組成的。你可以認為結構體是一種聚合類型
    2022-05-05
  • C++函數(shù)指針詳解

    C++函數(shù)指針詳解

    這篇文章主要介紹了C++函數(shù)指針詳解,通過文字描述C++函數(shù)指針基礎概念,內涵詳細的代碼實現(xiàn)和解析,希望對你能夠有所幫助
    2021-06-06
  • C語言設計一個閃閃的圣誕樹

    C語言設計一個閃閃的圣誕樹

    本文使用C語言基礎知識在控制臺打印一個圣誕樹效果,真的很簡單哦,一起通過本文學習吧
    2016-12-12

最新評論

和静县| 德兴市| 专栏| 阳泉市| 察哈| 龙井市| 云梦县| 论坛| 姚安县| 兴义市| 岳池县| 江安县| 双桥区| 修武县| 连江县| 桃园县| 瓦房店市| 枝江市| 鸡东县| 普安县| 阳春市| 武宣县| 铜陵市| 松桃| 万州区| 左贡县| 鹿邑县| 荥阳市| 永昌县| 德惠市| 利川市| 六盘水市| 监利县| 嵊州市| 赣榆县| 桑日县| 五大连池市| 唐河县| 舟曲县| 海伦市| 双江|