单链表的C++实现

因为还有一年就毕业参加工作了,感觉码代码的手有点生,特别是对于数据结构和算法,所以从不写博客的我开始写博客了。博客随缘更新,只做记录用,欢迎大佬指出错误以及不符合一般编程习惯的地方。

先写一个最简单的链表好了,以下是头文件:

//List.h
class LNode
{
public:
	int data;     //数据域
	LNode * next;  //指针域
};

class List
{
public:
	List();
	~List();
	void CreateList();
	void Insert(int data, int index, bool flag = true);
	void Delete(int index);
	void printList();
	void getData(int index);
	void exchange(int index1, int index2);
	int getLength();
private:
	LNode *head;//头结点
};

具体的实现文件以及测试的main函数:

//List.cpp
#include<iostream>
#include"List.h"
using namespace std;

List::List()
{
	head = new LNode;
	head->next = NULL;
	cout << "创建对象成功!" << endl;
}

List::~List()
{
	LNode *p = head, *s;
	while (p->next != NULL){
		s = p->next;
		p = s->next;
		delete s;
	}
	delete p;
	delete head;
}

int List::getLength()
{
	int len = 0;
	LNode *p = head;
	while (p->next!=NULL)
	{
		len++;
		p = p->next;
	}
	return len;
}

void List::CreateList()
{
	int data_num,data;
	cout << "开始创建链表(尾插),请输入数据个数: ";
	cin >> data_num;
	for (int i = 0; i < data_num;i++)
	{
		cout << "请输入第" << i + 1 << "个数据: ";
		cin >> data;
		Insert(data, getLength() + 2, false);//这里我就没有用正儿八经的尾插,因为已经有Insert函数了
	}
	cout << "CreateList: 创建完成" << endl;
}

//把元素data,插入第index个位置
void List::Insert(int data, int index,bool flag)
{
	LNode *p = head, *s;
	if (index<=0)
	{
		cout << "插入失败,请输入大于0的数!" << endl;
		return;
	}
	if (getLength() + 1 < index)
	{
		while (p->next != NULL)
		{
			p = p->next;
		}
		s = (LNode *)new LNode[1];
		s->data = data;
		s->next = NULL;
		p->next = s;
		if (flag != false)
		{
			cout << "Insert: 链表长度为" << getLength()-1 << ",无法插入到第" << index << "个位置;";
			cout << "现将数据" << data << "插入链表尾部!" << endl;
		}
	}
	else
	{
		for (int i = 0; i < index-1; i++)
		{
			p = p->next;
		}
		s = (LNode *)new LNode[1];
		s->data = data;
		s->next = p->next;
		p->next = s;
		cout << "数据" << data <<"插入" << "第" << index <<"位置成功!" << endl;
	}
}

//删除元素
void List::Delete(int index)
{
	LNode *p = head, *s;
	int i = 0;
	if (index <= 0 || index>getLength())
	{
		cout << "待删除元素不在链表中" << endl;
		return;
	}
	while (i<index-1)
	{
		i++;
		p = p->next;
	}
	
	s = p->next;
	p->next = s->next;
	cout << "第" << index <<"个元素删除成功!" << endl;
	delete s;
}

//打印链表
void List::printList()
{
	LNode *p = head;
	cout << "printList: ";
	if (p->next==NULL)
	{
		cout << "空链表" << endl;
		return;
	}
	p = p->next;
	while (p!=NULL)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

//交换元素
void List::exchange(int index1, int index2)
{
	LNode *p = head, *s1, *s2;
	s1 = (LNode *)new LNode[1];
	s2 = (LNode *)new LNode[1];
	int data;
	int min = (index1 > index2) ? index2 : index1;
	int max = (index1 > index2) ? index1 : index2;
	if (min<=0 || max>getLength())
	{
		cout << "待交换元素超过链表范围" << endl;
		return;
	}
	p = p->next;
	for (int i = 1; i <= max;i++)
	{
		if (i==min)
		{
			s1 = p;
		}
		if (i==max)
		{
			s2 = p;
		}
		p = p->next;
	}
	data = s1->data;
	s1->data = s2->data;
	s2->data = data;
	cout << "第" << index1 << "个元素和" << "第" << index2 << "个元素交换成功" << endl;
}

//打印第index个元素
void List::getData(int index)
{
	LNode *p = head;
	if (index <= 0 || index>getLength())
	{
		cout << "待查找元素不在链表中" << endl;
		return;
	}
	for (int i = 0; i < index;i++)
	{
		p = p->next;
	}
	cout << "第" << index << "元素为" << p->data << endl;
}
int main()
{
	List list;
	list.CreateList();
	list.printList();
	list.Insert(10, 2);
	list.Insert(20, 10);
	list.printList();
	list.Delete(2);
	list.printList();
	list.getData(1);
	list.getData(2);
	list.getData(3);
	list.getData(4);
	list.getData(10);
	list.exchange(1,2);
	list.printList();
	list.exchange(4, 3);
	list.printList();
	return 0;
}

运行结果如下:

猜你喜欢

转载自blog.csdn.net/h294455907/article/details/80223345
今日推荐