1. 程式人生 > >單鏈表操作函式C++實現

單鏈表操作函式C++實現

最近在學習資料結構的連結串列,剛開始接觸,肯定有某些沒發現的錯誤,歡迎大家指出來。

好了,不說廢話了,直接上程式碼

首先是單鏈表的.H檔案

#pragma once

typedef int DataType;
#define Node ElemType

//定義節點
class Node 
{
public:
	int value;
	Node* next;
};

//定義單鏈表
class LinkList {
public:
	//構建單鏈表
	LinkList();
	//銷燬單鏈表
	~LinkList();
	//建立一個單鏈表
	void CreateLinkList(int n);
	//遍歷線性表
	void TravalLinkList();
	//獲取線性表長度
	int GetLength();
	//判斷單鏈表是否為空
	bool IsEmpty();
	//查詢節點
	ElemType *FindNode(DataType data);
	//在連結串列尾部插入指定元素
	void InsertElemAtEnd(DataType data);
	//在連結串列指定位置插入指定元素
	void InsertElemAtIndex(DataType data, int n);
	//在連結串列頭部插入指定元素
	void InsertElemAtHead(DataType data);
	//刪除尾部元素
	void DeleteElemAtEnd();
	//刪除指定元素
	void DeleteElemAtIndex(DataType data);
	//刪除頭部元素
	void DeleteElemAtHead();

private:
	ElemType* head;
};

然後是對應的.cpp檔案

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

#define MaxSize 10000
//構建單鏈表
LinkList::LinkList()
{
	head = new ElemType;
	head->value = 0;
	head->next = NULL;
}

//銷燬單鏈表
LinkList::~LinkList()
{
	delete head;
}

//建立一個單鏈表
void LinkList::CreateLinkList(int n)
{
	ElemType *pnew, *ptemp;
	ptemp = head;
	if (n<0 || n>MaxSize)
	{
		std::cout << "輸入節點個數有誤" << std::endl;
	}
	std::cout << "請依次輸入" << n << "個元素:";
	for (int i = 0; i < n; i++)
	{
		pnew = new ElemType;
		std::cin >> pnew->value;
		pnew->next = NULL;
		ptemp->next = pnew;
		ptemp = pnew;
		
	}

}


//遍歷線性表
void LinkList::TravalLinkList()
{
	if (head == NULL || head->next == NULL)
	{
		std::cout << "連結串列為空表" << std::endl;
	}
	std::cout << "連結串列中的資料依次為:";
	ElemType *p = head->next;
	while (p != NULL)
	{
		std::cout << p->value << " ";
		p = p->next;
	}
}

//獲取線性表長度
int LinkList::GetLength()
{
	int count = 0;
	ElemType *p = head->next;
	while (p != NULL)
	{
		count++;
		p = p->next;
	}
	return count;
}

//判斷單鏈表是否為空
bool LinkList::IsEmpty()
{
	if (head->next == NULL)
		return true;
	else
		return false;
}

//查詢節點,在查詢不到該元素時會造成錯誤中斷
ElemType *LinkList::FindNode(DataType data)
{
	ElemType *p = head->next;
	if (p == NULL)
	{
		std::cout << "連結串列為空" << std::endl;
		return false;
	}
	else
	{
		while (p != NULL)
		{
			if (p->value == data)
			{
				return p;
			}
			p = p->next;
		}
		return NULL;
	}	
}

//在連結串列尾部插入指定元素
void LinkList::InsertElemAtEnd(DataType data)
{
	ElemType *newNode = new ElemType;
	newNode->next = NULL;
	newNode->value = data;
	ElemType *p = head;
	if (head->next == NULL)
	{
		head->next = newNode;
	}
	else
	{
		while (p->next != NULL)
		{
			p = p->next;
		}
		p->next = newNode;

	}
}

//在連結串列指定位置插入指定元素
void LinkList::InsertElemAtIndex(DataType data,int n)
{
	if (n<0 || n>GetLength())
	{
		std::cout << "插入位置不合理"<< std::endl;
	}
	else
	{
		ElemType *newNode = new ElemType;
		newNode->value = data;
		ElemType *p = head;
		int i = 1;
		while (n > i)
		{
			p = p->next;
			i++;
		}
		newNode->next = p->next;
		p->next = newNode;
	}
}

//在連結串列頭部插入指定元素
void LinkList::InsertElemAtHead(DataType data)
{
	ElemType *newNode = new ElemType;
	newNode->value = data;
	ElemType *p = head;
	if (p == NULL)
	{
		head->next = newNode;
	}
	newNode->next = p->next;
	p->next = newNode;
}

//刪除尾部元素
void LinkList::DeleteElemAtEnd()
{
	ElemType *p = head;
	ElemType *ptemp=NULL;
	if (head == NULL)
	{
		std::cout << "連結串列為空" << std::endl;
	}
	else
	{
		while (p->next != NULL)
		{
			ptemp = p;
			p = p->next;
		}
		delete p;
		p = NULL;
		ptemp->next = NULL;
	}
}

//刪除指定元素
void LinkList::DeleteElemAtIndex(DataType data)
{
	ElemType *ptemp =FindNode(data);
	if (ptemp == head->next)
	{
		DeleteElemAtHead();
	}
	else
	{
		ElemType *p = head;
		while (p->next != ptemp)
		{
			p = p->next;
		}
		p->next = ptemp->next;
		delete ptemp;
		ptemp = NULL;
	}
}

//刪除頭部元素
void LinkList::DeleteElemAtHead()
{
	ElemType *p = head;
	if (p == NULL || p->next == NULL)
	{
		std::cout << "連結串列為空" << std::endl;
	}
	else
	{
		ElemType *ptemp = NULL;
		p = p->next;
		ptemp = p->next;
		delete p;
		p = NULL;
		head->next = ptemp;
	}
}

至於主程式就自己隨意了,因為都是函式,直接呼叫就可以了

注意:

  我發現在查詢節點函式.FindNode(data)中,如果查詢不到該元素會返回錯誤造成程式進入中斷,目前能力有限,還不能解決,也希望有了解的小夥伴可以告知一下,非常感謝