心血來潮又實現了一遍單鏈表,加深了下對鏈式存結構的理解。
頭結點:爲了操作方便,在單鏈表的第一個結點之前附加一個結點,稱爲頭結點。頭結點的數據域可以存儲數據標題、表長等信息,也可以不存儲任何信息,其指針域存儲第一個結點的首地址
頭插法:將每次插入的新結點放在頭結點之後,其特點是讀入的數據順序與線性表的邏輯順序正好相反
尾插法:將每次插入的新結點放在鏈表的尾部(鏈表中結點的順序與輸入的順序一致)
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;
}