單鏈表實現

心血來潮又實現了一遍單鏈表,加深了下對鏈式存結構的理解。

頭結點:爲了操作方便,在單鏈表的第一個結點之前附加一個結點,稱爲頭結點。頭結點的數據域可以存儲數據標題、表長等信息,也可以不存儲任何信息,其指針域存儲第一個結點的首地址

頭插法:將每次插入的新結點放在頭結點之後,其特點是讀入的數據順序與線性表的邏輯順序正好相反 

尾插法:將每次插入的新結點放在鏈表的尾部(鏈表中結點的順序與輸入的順序一致)

SingleLink.h

#pragma once
#include <string>
#include <iostream>
using namespace std;

// 商品信息結構體
typedef struct GoodsInfo
{
	char chName[20];
	int iPrice;
	GoodsInfo* pNext;

}STGoodsInfo;


// 單鏈表
class SingleLink
{
public:
	SingleLink();

	~SingleLink();

	// 創建節點
	STGoodsInfo* CreateNode(STGoodsInfo& stGoodsInfo);

	//(增)後插節點
	bool InsertNodeBack(STGoodsInfo* pHead ,STGoodsInfo& stGoodsInfo);

	//(增)前插節點
	bool InserNodePre(STGoodsInfo*pHead,STGoodsInfo& stGoodsInfo);

	//(增)插入到指定地點
	bool InsertNodeAppointPos(STGoodsInfo* pHead,STGoodsInfo& stGoodsInfo);

	// 刪除指定位置的節點
	STGoodsInfo* Remove(STGoodsInfo*pHead,int iPos);

	// 修改節點
	bool ChangeNode(STGoodsInfo*pHead,int iPos, STGoodsInfo& stGoodsInfo);

	// 查找節點
	int SelectNode(STGoodsInfo*pHead, STGoodsInfo& stGoodsInfo);

	// 遍歷鏈表
	void PrintLink(STGoodsInfo*pHead);

	// 清空鏈表
	void ClearLink(STGoodsInfo*pHead);

	// 合併鏈表
	void AppendLink(STGoodsInfo*pHead, STGoodsInfo*pHead2);

	// 鏈表長度
	int Size(STGoodsInfo*pHead);

	// 測試鏈表
	void TestLink();

	// 測試鏈表2
	void TestLinkFunc();
private:

};

SingleLink.cpp

#include "SingleLink.h"
SingleLink::SingleLink()
{
}

SingleLink::~SingleLink()
{
}

// 創建節點
STGoodsInfo* SingleLink::CreateNode(STGoodsInfo& stGoodsInfo)
{
	STGoodsInfo*newNode = (STGoodsInfo*)malloc(sizeof(STGoodsInfo));
	strcpy(newNode->chName, stGoodsInfo.chName);
	newNode->iPrice = stGoodsInfo.iPrice;
	newNode->pNext = stGoodsInfo.pNext;

	return newNode;
}

// 後插節點
bool SingleLink::InsertNodeBack(STGoodsInfo* pHead, STGoodsInfo& stGoodsInfo)
{
	if(NULL == pHead)
	{
		cout << " 頭結點爲空"<< endl;
		return false;
	}

	while(NULL != pHead->pNext)
	{
		pHead = pHead->pNext;
	}

	STGoodsInfo* nextNode = CreateNode(stGoodsInfo);
	pHead->pNext = nextNode;

	return true;
}

// 前插節點
bool SingleLink::InserNodePre(STGoodsInfo*pHead, STGoodsInfo& stGoodsInfo)
{
	if(NULL == pHead)
	{
		cout << " 頭結點爲空" << endl;
		return false;
	}

	STGoodsInfo* nextNode = CreateNode(stGoodsInfo);
	nextNode->pNext = pHead->pNext;
	pHead->pNext = nextNode;

	return true;
}
// 插入到指定地點
bool SingleLink::InsertNodeAppointPos(STGoodsInfo* pHead, STGoodsInfo& stGoodsInfo)
{
	return true;
}

// 移除節點
STGoodsInfo* SingleLink::Remove(STGoodsInfo*pHead, int iPos)
{
	if(NULL == pHead)
	{
		return NULL;
	}
	if(iPos <=0)
	{
		return NULL;
	}

	STGoodsInfo* pTemp = pHead->pNext;
	
	// 遍歷到待刪除節點的前一個節點
	
	for(int i = 1;i<iPos;i++)
	{
		pHead = pHead->pNext;
		pTemp = pHead;
	}
	 
	// 待刪除節點
 	STGoodsInfo* pDel = pTemp->pNext;   
 	pTemp->pNext = pDel->pNext;
 
 	free(pDel);
 	pDel = NULL;
	
	return pHead;
}

// 修改節點
bool SingleLink::ChangeNode(STGoodsInfo*pHead, int iPos, STGoodsInfo& stGoodsInfo)
{
	if(NULL == pHead)
	{
		return false;
	}

	pHead = pHead->pNext; // 第一個節點

	for(int i = 1;i< iPos;i++)
	{
		pHead = pHead->pNext;
	}
	
	strcpy(pHead->chName, stGoodsInfo.chName);
	pHead->iPrice = stGoodsInfo.iPrice;
	
	return true;
}

// 查找節點
int SingleLink::SelectNode(STGoodsInfo*pHead, STGoodsInfo& stGoodsInfo)
{
	return 0;
}

// 打印鏈表
void SingleLink::PrintLink(STGoodsInfo*pHead)
{
	if(NULL == pHead)
	{
		cout << "鏈表爲空" << endl;
		
		return;
	}

	pHead = pHead->pNext;
	while(pHead)
	{
		char chName[20];
		strcpy(chName, pHead->chName);
		int iPrice = pHead->iPrice;
		cout << "商品名稱"<< chName << endl;
		cout << "商品價格" << iPrice << endl;
		cout << "**************"<< endl;
		pHead = pHead->pNext;
	}
}

// 清空鏈表
void SingleLink::ClearLink(STGoodsInfo*pHead)
{

}

// 合併鏈表
void SingleLink::AppendLink(STGoodsInfo*pHead, STGoodsInfo*pHead2)
{
	if( (NULL== pHead) 
		|| (NULL == pHead2) )
	{
		return;
	}

	while(pHead->pNext)
	{
		pHead = pHead->pNext;
	}

	STGoodsInfo* pDelHead = pHead2;

	pHead->pNext = pHead2->pNext;
	free(pDelHead);

	pDelHead = NULL;
}

int SingleLink::Size(STGoodsInfo*pHead)
{
	int iCount = 0;
	pHead = pHead->pNext;
	while(pHead)
	{
		if(NULL != pHead)
		{
			iCount++;
		}
		pHead = pHead->pNext;
	}
	return iCount;
}

/*
	對水果進行增刪改查,
	水果和手機鏈表合併
	最後銷燬
*/

void SingleLink::TestLink()
{
	STGoodsInfo *pHead = NULL;
	pHead = (STGoodsInfo*)malloc(sizeof(STGoodsInfo));
	pHead->pNext = NULL;

	// 新增蘋果
	STGoodsInfo stApple;
	strcpy(stApple.chName,"apple");

	stApple.iPrice = 4;
	stApple.pNext = NULL;
	InsertNodeBack(pHead, stApple);

	// 新增橘子
	STGoodsInfo stOrange;
	strcpy(stOrange.chName, "Orange");
	stOrange.iPrice = 5;
	stOrange.pNext = NULL;
	InsertNodeBack(pHead, stOrange);

	// 新增甜瓜
	STGoodsInfo stMelon;
	strcpy(stMelon.chName, "Melon");
	stMelon.iPrice = 6;
	stMelon.pNext = NULL;
	InsertNodeBack(pHead, stMelon);

	// 新增可可
	STGoodsInfo stCoco;
	strcpy(stCoco.chName, "Coco");
	stCoco.iPrice = 7;
	stCoco.pNext = NULL;
	InsertNodeBack(pHead, stCoco);

	//PrintLink(pHead);
	
	// 第二條鏈表
	STGoodsInfo *pPhoneLink;
	pPhoneLink = (STGoodsInfo *)malloc(sizeof(STGoodsInfo));
	pPhoneLink->pNext = NULL;

	STGoodsInfo stiPhone;
	strcpy(stiPhone.chName, "iPhoneX");
	stiPhone.iPrice = 10;
	stiPhone.pNext = NULL;
	InsertNodeBack(pPhoneLink, stiPhone);

	STGoodsInfo stHUAWEI;
	strcpy(stHUAWEI.chName, "HUAWEI P30 Pro");
	stHUAWEI.iPrice = 20;
	stHUAWEI.pNext = NULL;
	InsertNodeBack(pPhoneLink, stHUAWEI);

	AppendLink(pHead,pPhoneLink);
	PrintLink(pHead);
	//pHead->
}

void SingleLink::TestLinkFunc()
{
	STGoodsInfo *pHead = NULL;
	pHead = (STGoodsInfo*)malloc(sizeof(STGoodsInfo));
	pHead->pNext = NULL;

	// 新增蘋果
	STGoodsInfo stApple;
	strcpy(stApple.chName, "apple");

	stApple.iPrice = 4;
	stApple.pNext = NULL;
	InserNodePre(pHead, stApple);

	// 新增橘子
	STGoodsInfo stOrange;
	strcpy(stOrange.chName, "Orange");
	stOrange.iPrice = 5;
	stOrange.pNext = NULL;
	InserNodePre(pHead, stOrange);

	// 新增甜瓜
	STGoodsInfo stMelon;
	strcpy(stMelon.chName, "Melon");
	stMelon.iPrice = 6;
	stMelon.pNext = NULL;
	InserNodePre(pHead, stMelon);

	// 新增可可
	STGoodsInfo stCoco;
	strcpy(stCoco.chName, "Coco");
	stCoco.iPrice = 7;
	stCoco.pNext = NULL;
	InserNodePre(pHead, stCoco);
	PrintLink(pHead);
	//InserNodePre
}

main.cpp

#include<iostream>
using namespace std;
#include "SingleLink.h"

int main()
{
	SingleLink mSingleLink;
	mSingleLink.TestLink();

	cin.get();
	return 0;
}

 

發佈了195 篇原創文章 · 獲贊 41 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章