c++实现链表( 链表的创建,打印,插入(头插,尾插,中插),逆置 )

在本人所写的代码:在链表创建的时候,需要自己输入一个个数来充当每个节点的数据,当输入零的时候,链表穿创建结束,但0本身并没有存储到链表里面去,当然,这里的0也可以自己改成一个字符,这样更好一点,不会让链表本身无法存储0这个数字。另外,本人创建的时候是创建了一个带头结点的链表。链表的插入本人是分成三个部分来写的,分别是头插,尾插,中插。

具体实现代码如下:

#include <iostream>
using namespace std;

typedef struct node
{
	int date;
	struct node *next;
}Node;

class LinkList
{
private:
	Node *head;
public:
	LinkList();									//初始化单链表
	~LinkList();
	int GetLength();							//获取单链表的长度
	bool IsEmpty();								//判断是否为空
 
    void Creat();	                         // 创建链表
	void HeadInsertNode(int date);			 // 从头部插入指定的元素
	void EndInsertNode(int date);			 //从尾部插入指定元素
	void IndexInsertNode(int n,int date);    //从指定位置后面插入元素
	void DeleteIndexNode(int n);                 //删除指定位置的元素
	void Reverse();                              //反转链表
	void Display();                              //显示链表
};

LinkList::LinkList()
{
	Node *tmp = new Node;
	head= tmp;
}
LinkList::~LinkList()
{
	Node *p = head;
	while(head)
	{
		p = head;
		head = head->next;
		delete(p);
	}
}
bool LinkList::IsEmpty()
{
	
}
int LinkList::GetLength()
{
	int length = 0;
	Node *p = head->next;
	while( p != NULL )
	{
		length++;
		p = p->next;
	}
	return length;
}

void LinkList::Creat()
{
	Node *p,*s;
	int x,cycle=1;
	p = head;
	while(cycle)
	{
		cout << "please inpur a number:" << endl;
		cin >> x;
		if(x!=0)
		{
			s = new Node;
			s->date = x;
			p->next = s;
			p = s;
		}
		else
			cycle = 0;
	}
	//head = head->next;
	p->next = NULL;
	cout << "链表建立成功!" << endl;	
}

void LinkList::HeadInsertNode(int date)
{
	Node *p1 = new Node;
	p1->date = date;
	p1->next = head->next;
	head->next = p1;
}

void LinkList::IndexInsertNode(int n,int date)
{
	Node *p = head->next;
	int count = 0;
	int length = GetLength();
	if( n <= 0 || length < n)
		cout << "插入位置不正确!" << endl;
	while(p != NULL)
	{	
		count++;
		if( count == n )
		{
			node *p1 = new Node;
			p1->date = date;
			p1->next = p->next;
			p->next = p1;
		}
		p = p->next;
	}
}

void LinkList::EndInsertNode(int date)
{
	Node *p = head->next;
	while( p != NULL )
	{
		if( p->next == NULL )
		{
			Node *p1 = new Node;
			p1->date = date;
			p1->next = NULL;
			p->next = p1;
			break;
		}
		p = p->next;		
	}	
}

void LinkList::Reverse()
{
	if( head->next == NULL )
	{
		cout << "链表为空,无需翻转" << endl;
		exit(0);
	}
	Node *p1, *p2, *p3;
	p1 = head; p2 = head->next;
	while(p2)
	{
		p3 = p2->next;
		p2->next = p1;
		p1 = p2;
		p2 = p3;
	}
	head->next->next = NULL;
	head->next = p1;
}
void LinkList::Display()
{
	Node *p = head->next;
	while( p != NULL )
	{
		cout << p->date <<" ";
		p = p->next;
	}
	cout << endl;
}

int main()
{
	LinkList A;
	A.Creat();

	A.Display();
	A.HeadInsertNode(99);
	A.Display();
	A.EndInsertNode(88);
	A.Display();
	A.Reverse();
	A.Display();
	A.IndexInsertNode(3,888);
	A.Display();
	

	return 0;
}

运行结果截图:

猜你喜欢

转载自blog.csdn.net/leikun153/article/details/81159076
今日推荐