C++簡單單向鏈表實現

#include "pch.h"
#include <iostream>


//創建鏈表
typedef struct ListTable 
{
	int nElement;    //鏈表元素
	int nSequence;   //節點序號
	ListTable *pNext;//下一個節點
}ListTable;


//初始化鏈表
//參數:元素的值
ListTable* initListTable(int nNum)
{
	//頭結點
	ListTable *head;
	//申請內存
	head = (ListTable*)malloc(sizeof(ListTable));
	//初始化成員變量
	head->nElement = nNum;
	head->nSequence =1;
	head->pNext = NULL;
	//返回頭結點指針
	return head;
}


//插入元素
//參數:鏈表指針 元素的值
void insertElement(ListTable *list, int nNum)
{
	//創建局部變量
	ListTable *pList = list;
	int nCount = list->nSequence;
	//申請新的節點空間
	ListTable *pNode = (ListTable*)malloc(sizeof(ListTable));
	//遍歷鏈表
	while (pList != NULL)
	{
		//如果下一個節點爲空,則插入元素
		if (pList->pNext ==NULL)
		{
			pList->pNext = pNode;
			pNode->nSequence = nCount + 1;
			pNode->nElement = nNum;
			pNode->pNext = NULL;
			return;
		}
		nCount += 1;
		pList = pList->pNext;
	}
}


//刪除指定序號元素
//參數:鏈表指針  元素序號
void deleteElement(ListTable *list,int nSequence)
{
	//如果是第一個節點,直接free
	if (list->nSequence == nSequence)
	{
		free(list);
		return;
	}

	//創建局部變量
	ListTable *pList = list;
	ListTable *pTmp=NULL;
	
	//遍歷鏈表
	while (pList!=NULL)
	{
		//如果序號相等,刪除指定序號元素
		if (pList->pNext->nSequence == nSequence)
		{
			pTmp = pList->pNext->pNext;
			free(pList->pNext);
			pList->pNext = pTmp;
			//之後的序號依次減一
			while (pTmp != NULL)
			{
				pTmp->nSequence -= 1;
				pTmp = pTmp->pNext;
			}
			return;
		}
		pList = pList->pNext;	
	}
	printf("節點不存在!\n");
}


//修改元素
//參數:鏈表指針  元素序號  元素的值
void changeElement(ListTable *list, int nSequence,int nNum)
{
	ListTable *pList = list;
	while (pList != NULL)
	{
		if (pList->nSequence == nSequence)
		{
			pList->nElement = nNum;
			return;
		}
		pList = pList->pNext;
	}
	printf("節點不存在!\n");
}


//釋放鏈表
//參數:鏈表指針
void deleteListTable(ListTable *list)
{
	ListTable *pList = list;
	ListTable *pTmp=NULL;
	while (pList != NULL)
	{
		pTmp= pList->pNext;
		free(pList);
		pList = pTmp;
	}
	printf("釋放完成!\n");
}


//遍歷鏈表元素
//參數:鏈表指針
void showElement(ListTable *list)
{
	ListTable *pList = list;
	if (pList == NULL)
	{
		printf("鏈表爲空!\n");
		return;
	}
	while (pList != NULL)
	{
		printf("鏈表元素:%d  元素序號:%d\n", pList->nElement, pList->nSequence);
		pList = pList->pNext;
	}
}


int main()
{
	//初始化鏈表 第一個元素爲1
	ListTable *list= initListTable(1);
	//插入2,3,4,5四個元素
	insertElement(list, 2);
	insertElement(list, 3);
	insertElement(list, 4);
	insertElement(list, 5);
	//修改序號5的元素爲6
	changeElement(list, 5, 6);
	//刪除序號爲3的元素
	deleteElement(list, 3);
	//遍歷
	showElement(list);
	//釋放
	deleteListTable(list);
}

vs2017編譯

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章