用c++写一个链表

1.首先写头文件Linklist.h。每个节点都有两个要素:数据和指针。定义linklist类,声明一些基本操作函数,如下:

#include <iostream>
struct Node {
	int data;
	Node *next;
};
class Linklist {
private:
	Node * Head;
public:
	Linklist();
	void CreatList1(int n);        //头插入法创建链表
	void CreatList2(int n);        //尾插入法创建链表
	void Insert(int i, int e);     //插入函数
	int Delete(int i);             //删除表中元素
	int GetData(int i);            //取得表中元素值
	int Search(int obj);           //在表中寻找匹配项
	int ListLength();              //获得表的长度
	void Display();                //遍历整个链表
};

2.在cpp文件中重定义基本操作函数,如下:

Linklist::Linklist() {                   //构造函数
	Head = new Node;
	Head->next = NULL;
}
void Linklist:: CreatList1(int n) {      //头插入法创建链表
	Node *p;
	Node *temp;
	p = Head;
	cout << "请依次输入" << n << "个链表的值:";
	for (int i = 1; i <= n; i++) {
		temp = new Node;
		cin >> temp->data;
		temp->next = p->next;
		p->next = temp;
	}
}
void Linklist::CreatList2(int n) {      //尾插入法创建链表
	Node *p;
	Node *temp;
	p = Head;
	cout<< "请依次输入" << n << "个链表的值:";
	for (int i = 0; i < n; i++) {
		temp = new Node;
		cin >> temp->data;
		p->next = temp;
		p = temp;
	}
}
 
void Linklist::Insert(int i, int e) {       //在i处插入e
	Node *temp;
	temp = Head;
	int j = 0;
	while (temp&&j < i-1) {
		temp = temp->next;
		j++;
	}
	if (!temp || j > i - 1) {
		cout << "插入位置错误";
	}
	else {
		Node *s;
		s = new Node;
		s->data = e;
		s->next = temp->next;
		temp->next = s;
	}
}
int Linklist::Delete(int i) {          //删除i处的数据
	Node *temp;
	temp = Head;
	int j = 0;
	while (temp&&j < i - 1) {
		temp = temp->next;
		j++;
	}
	if (!temp || j > i - 1) {
		cout << "删除位置错误";
		return -1;
	}
	else {
		Node *s;
		s = temp->next;
		temp->next = s->next;
		delete s;
	}
}
int Linklist::GetData(int i){         //得到i处的元素
	Node *temp;
	temp = Head;
	int j = 0;
	while (temp&&j < i - 1) {
		temp = temp->next;
		j++;
	}
	if (!temp || j > i - 1) {
		cout << "寻找位置错误\n";
		return -1;
	}
	else {
		cout << i << "处的数据为:" << temp->next->data<<"\n";
		return temp->data;
	}
}
int Linklist::Search(int obj) {       //寻找链表中有无与obj匹配的元素
	int j = 1;
	Node *temp;
	temp = Head->next;
	while (temp && temp->data != obj) {
		temp = temp->next;
		j++;
	}
	if (temp == NULL) {
		cout << "该链表中无此元素"<<"\n";
		return 0;
	}
	else {
		cout << "在该链表中的第" << j << "个元素等于"<<obj<<"\n";
		return j;
	}
}
int Linklist::ListLength() {                //计算链表长度
	Node *temp;
	temp = Head;
	int j = 0;
	while (temp) {
		temp = temp->next;
		j++;
	}
	cout << "该链表的长度为:" << j-1<<"\n";
	return j;
}
void Linklist::Display(){
	Node *temp;
	temp = Head->next;
	int e;
	cout << "该链表的遍历依次为:";
	while (temp) {
		e = temp->data;
		cout << e << " ";
		temp = temp->next;
	}
	cout << "\n";
  }

3.测试主函数如下:

void main() {   //测试小程序
	int user_num;
	cout << "请输入链表的长度:";
	cin >> user_num;
	Linklist list1;
	Linklist list2;
	list1.CreatList1(user_num);  //头插入法依次插入元素
	cout << "头插入法创造的链表\n";
	list1.Display();     
	list1.Insert(2, 99);
	list1.Display();
	list1.GetData(2);
	list1.Search(11);
	list1.Search(99);
	list1.Delete(3);
	list1.Display();
	list1.ListLength();
 
	list2.CreatList2(4);
	list2.Display();
 
 
}

测试结果如下图:

猜你喜欢

转载自blog.csdn.net/zhuiqiuzhuoyue583/article/details/82561771