国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】單向鏈表

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】單向鏈表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

哈嘍,大家好,今天我們學習的是數(shù)據(jù)結(jié)構(gòu)里的鏈表,這里主要講的是不帶哨兵衛(wèi)頭節(jié)點的單向鏈表,下篇將會繼續(xù)帶大家學習雙向鏈表。

目錄

1.鏈表的概念

2.單向鏈表接口的實現(xiàn)

2.1動態(tài)申請一個節(jié)點

2.2單鏈表打印

2.3單鏈表尾插

2.4單鏈表頭插

2.5單鏈表尾刪

2.6單鏈表頭刪

2.7在pos位置插入x

2.7.1在pos位置前插入x

2.7.2在pos位置后插入x

2.8刪除pos位置值

2.9 查找x的地址

2.10銷毀鏈表

3.完整代碼


1.鏈表的概念

在上篇文章,我們已經(jīng)學習了順序表,不知大家有沒有發(fā)現(xiàn)順序表在一定程度上是存在缺陷的,比如說:

  1. 空間不夠了的時候需要擴容,擴容需要付出代價(特別是異地擴空間)
  2. 為了避免頻繁擴容,我們滿了基本都是擴2倍,可能會導致一定的空間浪費
  3. 順序表要求數(shù)據(jù)從開始位置連續(xù)存儲,那么我們在頭部或者中間位置插入刪除數(shù)據(jù)就需要挪動數(shù)據(jù),效率不高

針對順序表的缺陷,就有了鏈表來存儲數(shù)據(jù)

概念:鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的 。

【數(shù)據(jù)結(jié)構(gòu)】單向鏈表

?鏈表的定義:

【數(shù)據(jù)結(jié)構(gòu)】單向鏈表

?這里的data就是要存放的數(shù)據(jù)

2.單向鏈表接口的實現(xiàn)

下面是要介紹的常用到的鏈表接口函數(shù)以及實現(xiàn)方法:

//打印
void SListPrint(SLTNode* phead);
//創(chuàng)建新節(jié)點
SLTNode* BuyListNode(SLTDateType x);
//尾插
void SListPushBack(SLTNode** pphead, SLTDateType x);
//頭插
void SListPushFront(SLTNode** pphead, SLTDateType x);
//頭刪
void SListPopBack(SLTNode** pphead);
//尾刪
void SListPopFront(SLTNode** pphead);
//查找
SLTNode* SListFind(SLTNode* phead, SLTDateType x);
//插入
void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x);
void SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x);
//刪除
void SListErase(SLTNode** pphead, SLTNode* pos);
//銷毀
void SListDestroy(SLTNode** pphead);

2.1動態(tài)申請一個節(jié)點

由于我們每次給鏈表插入數(shù)據(jù)時,都需要動態(tài)開辟空間來申請節(jié)點,所以我們把這個過程封裝成一個函數(shù),方便后續(xù)操作。

動態(tài)申請一個節(jié)點的步驟是先向計算機內(nèi)存申請一塊空間,這里我們將申請的空間用指針變量newnode來存儲,然后將newnode中的data賦值,因為這是新開辟的節(jié)點,所以暫時將newnode中的next指向空。

注意:為了提高程序的可靠性,我們在動態(tài)內(nèi)存申請后記得檢查是否申請失敗了,如果申請失敗了輸出提示信息,并退出程序。

SLTNode* BuyListNode(SLTDateType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)//如果動態(tài)內(nèi)存申請失敗就退出程序
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

2.2單鏈表打印

打印鏈表就是一個遍歷鏈表的過程,我們首先定義一個指針(cur)指向鏈表的頭節(jié)點,然后輸出該節(jié)點的值,然后將指針指向下一個節(jié)點(cur=cur->next),依次進行,直到cur為空指針時停止

void SListPrint(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;//將cur指向下一個節(jié)點
	}
	printf("NULL\n");
}

2.3單鏈表尾插

尾插,就是先找到鏈表中最后一個節(jié)點,然后將數(shù)據(jù)插入到最后。

但是,我們要先判斷鏈表是否為空,如果鏈表為空,我們直接直接將鏈表的頭指針賦予要插入的數(shù)據(jù)。

由于尾插要改變鏈表,所以傳參要用二級指針,包括下面的尾插,尾刪,頭刪等都要用二級指針傳參

【數(shù)據(jù)結(jié)構(gòu)】單向鏈表

void SListPushBack(SLTNode** pphead, SLTDateType x)
{
	SLTNode* newnode = BuyListNode(x);
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}

2.4單鏈表頭插

頭插是比較簡單的一種操作,只需要申請新節(jié)點,將新節(jié)點的next指向鏈表的頭,再讓新節(jié)點成為鏈表的頭即可。

【數(shù)據(jù)結(jié)構(gòu)】單向鏈表

void SListPushFront(SLTNode** pphead, SLTDateType x)
{
	SLTNode* newnode = BuyListNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

2.5單鏈表尾刪

尾刪:每次找到鏈表的最后一個節(jié)點和倒數(shù)第二個節(jié)點,然后釋放最后一個節(jié)點所占的看空間并將最后一個節(jié)點置空,同時將倒數(shù)第二個節(jié)點的next指向NULL;如果鏈表只剩下一個節(jié)點,直接釋放并置空該節(jié)點(這一步需要單獨考慮)

注意:為了避免鏈表為空但有調(diào)用尾刪的情況,我們需要斷言一下,當傳過來的鏈表是空鏈表的時候,程序就會報錯

【數(shù)據(jù)結(jié)構(gòu)】單向鏈表

void SListPopBack(SLTNode** pphead)
{
	//保證鏈表不是空鏈表
	assert(*pphead != NULL);
	if ((*pphead)->next == NULL)
	{
		//當鏈表中只有一個節(jié)點
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SLTNode* tail = *pphead;
		SLTNode* prev = NULL;
		while (tail->next != NULL)
		{
			prev = tail;
			tail = tail->next;
		}
		prev->next = NULL;
		free(tail);
		tail = NULL;
	}
}

2.6單鏈表頭刪

頭刪是將第一個節(jié)點釋放然后指向第二個節(jié)點,在此之前需要定義一個指針next來保存第二個節(jié)點的地址。

【數(shù)據(jù)結(jié)構(gòu)】單向鏈表

void SListPopFront(SLTNode** pphead)
{
	//保證鏈表不是空鏈表
	assert(*pphead != NULL);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

2.7在pos位置插入x

在pos位置插入x分為兩種情況,一種是在pos前位置插入x ,另一種是在pos后位置插入x,下面將分別為大家介紹:

2.7.1在pos位置前插入x

在pos位置前插入x,只需要找到pos的前一個位置,我們把pos的前一個位置命名為posPrev,然后創(chuàng)建一個新節(jié)點newnode,將posPrev的下一個節(jié)點指向newnode,newnode的下一個節(jié)點指向pos即可,如下圖:

【數(shù)據(jù)結(jié)構(gòu)】單向鏈表

void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pphead != NULL);
	assert(pos != NULL);

	SLTNode* newnode = BuyListNode(x);
	if (*pphead == pos)
	{
		newnode->next = *pphead;
		*pphead = newnode;
	}
	else
	{
		//找到pos的前一個位置
		SLTNode* posPrev = *pphead;
		while (posPrev->next != pos)
		{
			posPrev = posPrev->next;
		}
		posPrev->next = newnode;
		newnode->next = pos;
	}
}

2.7.2在pos位置后插入x

在pos位置后插入x比在pos位置前插入x要簡單,不需要遍歷鏈表即可完成

void SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
?? ?assert(pos != NULL);
?? ?SLTNode* newnode = BuyListNode(x);
?? ?newnode->next = pos->next;
?? ?pos->next = newnode;
}

2.8刪除pos位置值

刪除pos位置值也需要先找到pos的前一個節(jié)點,因此也要考慮pos是鏈表的頭節(jié)點的情況

【數(shù)據(jù)結(jié)構(gòu)】單向鏈表

void SListErase(SLTNode** pphead, SLTNode* pos)
{
	assert(*pphead != NULL);
	assert(pos != NULL);
	if (*pphead == pos)
	{
		*pphead = pos->next;
		free(pos);
	}
	else
	{
		SLTNode* posPrev = *pphead;
		while (posPrev->next != pos)
		{
			posPrev = posPrev->next;
		}
		posPrev->next = pos->next;
		free(pos);
	}
}

2.9 查找x的地址

查找x的地址,如果查找到了x,則返回該節(jié)點的地址,否則返回空指針。這個步驟也要遍歷鏈表。

SLTNode* SListFind(SLTNode* phead, SLTDateType x)
{
	SLTNode* tail = phead;
	if (tail->data == x)
	{
		return tail;
	}
	while (tail ->data != x)
	{
		tail = tail->next;
		if (tail->data == x)
		{
			return tail;
		}
	}
	return NULL;
}

2.10銷毀鏈表

銷毀鏈表需要將所有節(jié)點所占的內(nèi)存全部釋放,再將鏈表的頭置為空即可。

void SListDestroy(SLTNode** pphead)
{
	assert(*pphead != NULL);
	SLTNode* cur = *pphead;
	while (cur != NULL)
	{
		SLTNode* next = cur->next;
		free(cur);
		cur = next;
	}
	*pphead = NULL;
}

3.完整代碼

SList.h文件:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int SLTDateType;
typedef struct SListNode
{
	SLTDateType data;
	struct SListNode* next;//存放下一個鏈表的地址
}SLTNode;

//打印
void SListPrint(SLTNode* phead);
//創(chuàng)建新節(jié)點
SLTNode* BuyListNode(SLTDateType x);
//尾插
void SListPushBack(SLTNode** pphead, SLTDateType x);
//頭插
void SListPushFront(SLTNode** pphead, SLTDateType x);
//頭刪
void SListPopBack(SLTNode** pphead);
//尾刪
void SListPopFront(SLTNode** pphead);
//查找
SLTNode* SListFind(SLTNode* phead, SLTDateType x);
//插入
void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x);
void SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x);
//刪除
void SListErase(SLTNode** pphead, SLTNode* pos);
//銷毀
void SListDestroy(SLTNode** pphead);

SList.c文件:

#include"SList.h"

void SListPrint(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;//將cur指向下一個節(jié)點
	}
	printf("NULL\n");
}

SLTNode* BuyListNode(SLTDateType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)//如果動態(tài)內(nèi)存申請失敗就退出程序
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

void SListPushBack(SLTNode** pphead, SLTDateType x)
{
	SLTNode* newnode = BuyListNode(x);
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}

void SListPushFront(SLTNode** pphead, SLTDateType x)
{
	SLTNode* newnode = BuyListNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

void SListPopBack(SLTNode** pphead)
{
	//保證鏈表不是空鏈表
	assert(*pphead != NULL);
	if ((*pphead)->next == NULL)
	{
		//當鏈表中只有一個節(jié)點
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SLTNode* tail = *pphead;
		SLTNode* prev = NULL;
		while (tail->next != NULL)
		{
			prev = tail;
			tail = tail->next;
		}
		prev->next = NULL;
		free(tail);
		tail = NULL;
	}
}


void SListPopFront(SLTNode** pphead)
{
	//保證鏈表不是空鏈表
	assert(*pphead != NULL);
	SLTNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

SLTNode* SListFind(SLTNode* phead, SLTDateType x)
{
	SLTNode* tail = phead;
	if (tail->data == x)
	{
		return tail;
	}
	while (tail ->data != x)
	{
		tail = tail->next;
		if (tail->data == x)
		{
			return tail;
		}
	}
	return NULL;
}

void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pphead != NULL);
	assert(pos != NULL);

	SLTNode* newnode = BuyListNode(x);
	if (*pphead == pos)
	{
		newnode->next = *pphead;
		*pphead = newnode;
	}
	else
	{
		//找到pos的前一個位置
		SLTNode* posPrev = *pphead;
		while (posPrev->next != pos)
		{
			posPrev = posPrev->next;
		}
		posPrev->next = newnode;
		newnode->next = pos;
	}
}

void SListInsertAfter(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{
	assert(pos != NULL);
	SLTNode* newnode = BuyListNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

void SListErase(SLTNode** pphead, SLTNode* pos)
{
	assert(*pphead != NULL);
	assert(pos != NULL);
	if (*pphead == pos)
	{
		*pphead = pos->next;
		free(pos);
	}
	else
	{
		SLTNode* posPrev = *pphead;
		while (posPrev->next != pos)
		{
			posPrev = posPrev->next;
		}
		posPrev->next = pos->next;
		free(pos);
	}
}

void SListDestroy(SLTNode** pphead)
{
	assert(*pphead != NULL);
	SLTNode* cur = *pphead;
	while (cur != NULL)
	{
		SLTNode* next = cur->next;
		free(cur);
		cur = next;
	}
	*pphead = NULL;
}

總結(jié):這篇文章主要寫的是單向鏈表,后續(xù)將繼續(xù)帶領(lǐng)大家學習雙向鏈表。如果我寫的有什么的不好之處,請在文章下方給出你寶貴的意見。如果覺得我寫的好的話請點個贊贊和關(guān)注哦~??文章來源地址http://www.zghlxwxcb.cn/news/detail-504774.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】單向鏈表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)篇】手寫雙向鏈表、單向鏈表(超詳細)

    【數(shù)據(jù)結(jié)構(gòu)篇】手寫雙向鏈表、單向鏈表(超詳細)

    什么是鏈表 ? 鏈表(Linked List)是用鏈式存儲結(jié)構(gòu)實現(xiàn)的線性表。鏈表示意圖: 鏈表的組成 : 數(shù)據(jù)域 + 引用域 (數(shù)據(jù)域和引用域合稱結(jié)點或元素) 數(shù)據(jù)域存放數(shù)據(jù)元素自身的數(shù)據(jù) 引用域存放相鄰結(jié)點的地址 鏈表的特點 : 鏈表中元素的聯(lián)系依靠引用域 具有線性結(jié)構(gòu)的特

    2024年02月11日
    瀏覽(29)
  • 數(shù)據(jù)結(jié)構(gòu)——單向鏈表(C語言版)

    在數(shù)據(jù)結(jié)構(gòu)和算法中,鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),它由一系列節(jié)點組成,每個節(jié)點包含數(shù)據(jù)和指向下一個節(jié)點的指針。在C語言中,我們可以使用指針來實現(xiàn)單向鏈表。下面將詳細介紹如何用C語言實現(xiàn)單向鏈表。 目錄 1. 定義節(jié)點結(jié)構(gòu)體 2. 初始化鏈表 3. 插入節(jié)點 4. 刪除節(jié)點

    2024年03月24日
    瀏覽(33)
  • 【數(shù)據(jù)結(jié)構(gòu)】單向鏈表實現(xiàn) 超詳細

    【數(shù)據(jù)結(jié)構(gòu)】單向鏈表實現(xiàn) 超詳細

    目錄 一. 單鏈表的實現(xiàn) 1.準備工作及其注意事項 1.1 先創(chuàng)建三個文件 1.2 注意事項:幫助高效記憶和理解 2.鏈表的基本功能接口 2.0 創(chuàng)建一個 鏈表 2.1 鏈表的 打印 ?3.鏈表的創(chuàng)建新節(jié)點接口 4.鏈表的節(jié)點 插入 功能接口 4.1 尾插接口 4.2 頭插接口 ? ??4.3 指定位置 pos 之前? 插入

    2024年02月19日
    瀏覽(23)
  • 數(shù)據(jù)結(jié)構(gòu):線性表之-單向鏈表(無頭)

    數(shù)據(jù)結(jié)構(gòu):線性表之-單向鏈表(無頭)

    目錄 什么是單向鏈表 順序表和鏈表的區(qū)別和聯(lián)系 順序表: 鏈表: 鏈表表示(單項)和實現(xiàn) 1.1 鏈表的概念及結(jié)構(gòu) 1.2單鏈表(無頭)的實現(xiàn) 所用文件 將有以下功能: 鏈表定義 創(chuàng)建新鏈表元素 尾插 頭插 尾刪 頭刪 查找-給一個節(jié)點的指針 改 pos位置之前插入 刪除pos位置的值 成品

    2024年02月09日
    瀏覽(92)
  • 數(shù)據(jù)結(jié)構(gòu)《鏈表》無頭單向非循環(huán)-動圖詳解

    數(shù)據(jù)結(jié)構(gòu)《鏈表》無頭單向非循環(huán)-動圖詳解

    前面學習了順序表發(fā)現(xiàn),順序表雖然好,但也有很多不足的地方,比方說,順序表是一塊連續(xù)的物理空間,如果頭插或者頭刪,那么整個數(shù)組的數(shù)據(jù)都要移動。但是鏈表不一樣,鏈表是通過指針訪問或者調(diào)整,鏈表是物理空間是不連續(xù)的,通過當前的next指針找到下一個。 插

    2024年02月06日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法】使用數(shù)組的結(jié)構(gòu)實現(xiàn)鏈表(單向或雙向)

    【數(shù)據(jù)結(jié)構(gòu)和算法】使用數(shù)組的結(jié)構(gòu)實現(xiàn)鏈表(單向或雙向)

    上文我們通過結(jié)構(gòu)體的結(jié)構(gòu)實現(xiàn)了隊列 、以及循環(huán)隊列的實現(xiàn),我們或許在其他老師的教學中,只學到了用結(jié)構(gòu)體的形式來實現(xiàn)鏈表、隊列、棧等數(shù)據(jù)結(jié)構(gòu),本文我想告訴你的是,我們 可以使用數(shù)組的結(jié)構(gòu)實現(xiàn)鏈表、單調(diào)棧、單調(diào)隊列 目錄 前言 一、用數(shù)組結(jié)構(gòu)的好處 1.數(shù)

    2024年01月20日
    瀏覽(91)
  • 數(shù)據(jù)結(jié)構(gòu)day06(單向循環(huán)鏈表、雙向鏈表)

    數(shù)據(jù)結(jié)構(gòu)day06(單向循環(huán)鏈表、雙向鏈表)

    雙向鏈表的練習代碼 head.h fun.c main.c 今日思維導圖哈 ???????

    2024年02月10日
    瀏覽(15)
  • 第14章_集合與數(shù)據(jù)結(jié)構(gòu)拓展練習(前序、中序、后序遍歷,線性結(jié)構(gòu),單向鏈表構(gòu)建,單向鏈表及其反轉(zhuǎn),字符串壓縮)

    第14章_集合與數(shù)據(jù)結(jié)構(gòu)拓展練習(前序、中序、后序遍歷,線性結(jié)構(gòu),單向鏈表構(gòu)建,單向鏈表及其反轉(zhuǎn),字符串壓縮)

    1、前序、中序、后序遍歷 分析: 完全二叉樹: 葉結(jié)點只能出現(xiàn)在最底層的兩層,且最底層葉結(jié)點均處于次底層葉結(jié)點的左側(cè) 2、線性結(jié)構(gòu) 3、其它 4、單向鏈表構(gòu)建 (1)定義一個單向鏈表SingleLinked類 包含私有的靜態(tài)內(nèi)部類Node 包含Object類型的data屬性和Node類型的next屬性 包含

    2024年01月23日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表)

    【數(shù)據(jù)結(jié)構(gòu)】之十分好用的“鏈表”趕緊學起來!(第一部分單向鏈表)

    ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ?? ?? 個人主頁 :阿然成長日記 ??點擊可跳轉(zhuǎn) ?? 個人專欄: ??數(shù)據(jù)結(jié)構(gòu)與算法??C語言進階 ?? 不能則學,不知則問,恥于問人,決無長進 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 前言 ??小伙伴們,

    2024年02月14日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)C/C++】單向鏈表的增刪改查

    單向鏈表是比較常用的數(shù)據(jù)結(jié)構(gòu),最近再面試手撕算法的時候偶爾有遇到,所以就花了一點時間簡單的寫了一下C/C++版本的單向鏈表的代碼。 這里我推薦使用C++版本,因為C++版本我特地優(yōu)化了一下,提供了用戶輸入的功能,當然兩個語言差異不大,注釋可以直接看C版本的,比

    2024年02月07日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包