C++ 实现简单的链表操作

C++简单链表 实现几个基本操作  其中倒叙,排序方法 使用数组来生成链表,导致 删除方法 使用delete p1 出错 如需修改可评论
#include <iostream>
#include <string.h>


using namespace std;

class Person
{
public:
	Person();
	~Person();
	void setID(int id);
	void setName(const char * name);
	int getID();
	char * getName() const;
	void setNext(Person * a);
	Person * getNext() const;
private:
	int ID;
	char * Name;
	Person * next;

};

Person::Person() :ID(0), next(nullptr), Name(NULL)
{

}

Person::~Person()
{
}

void Person::setID(int id) {

	ID = id;
}

void Person::setName(const char * name) {
	Name = new char[strlen(name) + 1];
	strcpy_s(Name, strlen(name) + 1, name);
}

int Person::getID() {
	return ID;
}

char * Person::getName() const {

	return Name;
}

Person * Person::getNext() const {
	return next;
}

void  Person::setNext(Person * a) {
	next = a;
}

class linklist
{
public:
	linklist();
	~linklist();
	void addLink(const int id, const char * Name);//添加一个节点
	void deletelist();//删除链表
	void insetNode(int position, const int id, const char * Name);//插入节点
	void reserve(); //倒序
	void sort();//排序
	Person * find(const int id) const;//查找一个节点
	void deleteNode(int position); //删除固定的节点
	void showList() const;//显示整个链表
	int getCount() const;//显示节点数目
	Person * getHead() const;
private:
	Person * head;
	int count;
};

void linklist::sort() {
	Person * p1, *p2;
	p1 = head->getNext();
	p2 = new Person[count];
	for (int i = 0; i<count; i++) {
		if (i != count - 1) {
			p2[i].setNext(&p2[i + 1]);
		}
		else {
			p2[i].setNext(NULL);
		}

	}
	for (int i = 0; i<count; i++) {
		p2[i].setName(p1->getName());
		p2[i].setID(p1->getID());
		for (int j = 0; j<i; j++) {
			if (p2[i].getID()<p2[j].getID()) {
				Person temp;
				temp.setName(p2[j].getName());
				temp.setID(p2[j].getID());
				p2[j].setName(p2[i].getName());
				p2[j].setID(p2[i].getID());
				p2[i].setName(temp.getName());
				p2[i].setID(temp.getID());
			}
		}
		p1 = p1->getNext();
	}
	p1 = head->getNext();
	delete[] p1;
	this->head->setNext(p2);
}


Person * linklist::getHead() const {

	return head;
}

int linklist::getCount() const {

	return count;

}

void linklist::showList() const {
	Person  *p2;
	p2 = head->getNext();
	if (!p2) {
		cout << "list is empty" << endl;
	}
	while (p2->getNext() != NULL) {
		cout << "ID:" << p2->getID() << endl;
		cout << "Name:" << p2->getName() << endl;
		p2 = p2->getNext();
	}
	cout << "ID:" << p2->getID() << endl;
	cout << "Name:" << p2->getName() << endl;
}

linklist::linklist() :count(0)
{
	head = new Person;
	head->setNext(NULL);
	head->setName("head");
	head->setID(0);
}

linklist::~linklist()
{
	delete head;
}

void linklist::addLink(const int id, const char * Name) {

	Person * p1, *p2;
	p2 = new Person;
	p1 = head;
	while (p1->getNext() != NULL)
	{
		p1 = p1->getNext();
	}
	p2->setID(id);
	p2->setName(Name);
	p2->setNext(NULL);
	p1->setNext(p2);
	count++;
}

void linklist::deletelist() {
	Person * p1, *p2;
	p1 = head->getNext();
	head->setNext(NULL);
	while (p1 != NULL)
	{
		p2 = p1->getNext();
		p1->setNext(NULL);
		delete p1;
		p1 = p2;
	}
	count = 0;
}

void linklist::insetNode(int position, const int id, const char * Name) {
	count++;
	Person * p1, *p2 = NULL;
	p1 = head;
	Person * insert_person = new Person;
	if (position > count || position < 1) {
		cout << "输入位置错误" << endl;
		return;
	}
	else {

		for (int i = 0; i < position; i++) {
			p2 = p1;
			p1 = p1->getNext();
		}

		insert_person->setID(id);
		insert_person->setName(Name);
		insert_person->setNext(p1);
		p2->setNext(insert_person);

	}
	cout << "insert sucessful" << endl;
}

void linklist::reserve() {
	Person * p1, *p2;
	Person * reser = new Person[count];
	p1 = head->getNext();
	for (int i = 0; i < count; i++) {
		if (i != count - 1)
			reser[i].setNext(&reser[i + 1]);
		else {
			reser[i].setNext(NULL);
		}
		reser[count - i - 1].setID(p1->getID());
		reser[count - i - 1].setName(p1->getName());
		p1 = p1->getNext();
	}
	p1 = head->getNext();
	head->setNext(NULL);
	while (p1 != NULL)
	{
		p2 = p1->getNext();
		delete p1;
		p1 = p2;
	}
	head->setNext(reser);
}



Person * linklist::find(int  id) const {

	Person * temp;
	temp = head->getNext();
	while (temp->getID() != id&&temp->getNext() != NULL)
	{
		temp = temp->getNext();
	}

	if (temp->getNext() == NULL) {

		return NULL;
	}
	return temp;

}

void linklist::deleteNode(int position) {
	Person * temp, *p1 = NULL;
	count--;
	temp = head;
	if (position > count && position < 0)
	{
		cout << "Worry position " << endl;
		return;
	}
	for (int i = 0; i < position; i++)
	{
		p1 = temp;
		temp = temp->getNext();
	}
	p1->setNext(temp->getNext());
	delete temp;
}

int main(void) {

	linklist a;
	a.addLink(1, "a");
	a.addLink(2, "b");
	a.addLink(3, "c");
	a.showList();
	a.reserve();
	a.showList();
	cout << "FOUND IT" << endl;
	cout << "Name:" << a.find(2)->getName() << endl;
	cout << "ID:" << a.find(2)->getID() << endl;
	a.insetNode(2, 10, "insert");
	a.showList();
	a.deleteNode(2);
	a.showList();
	a.sort();
	a.showList();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值