c++实现链表的基本操作

学习数据结构课程时所写,本人代码能力有限,如有不妥,欢迎指点吐舌头


#include <iostream>
using namespace std;
#define NO_FOUND 1
struct Node
{
	int data;   // 数据类型可以改变,此程序中以int为例子
	Node* next;
};
typedef Node* List_Node;
class List
{
public:
	List();     
	~List();
	int getLength();  // 返回链表总结点个数
	void Init_List();   // 创建新链表
	void Print_List(); // 遍历输出链表
	List_Node GetNode(int i); // 返回第i个结点
	void Delete_Node(int i);  // 删除第i个结点
	void Insert_Node(int x, int i);  // 在链表的第i个结点之前插入值为x的元素
	int Locate_Elem(int e); // 查找数据e所在结点的位置,从1开始
private:
	List_Node head;
};
List::List()
{
	head = NULL;
}
void List::Init_List()
{
	List_Node p, q;
	
	p = new Node;
	q = p;
	cout << "请输入几个数据(以-1表示结束):"<<endl;
	cin >> p->data;
	while (p->data != -1)
	{
		if (head == NULL)
			head = p;
		else
			q->next = p;
			
		q = p;
		p = new Node;
		/*cout << "请输入数据(以-1表示结束):" << endl;*/
		cin >> p->data;
	}
	q->next = NULL;
	delete p;
}
void List::Print_List()
{
	cout << "所有数据如下:" << endl;
	List_Node p=head;
	while (p)
	{
		cout<<p->data<<" ";
		p = p->next;
	}
}
List_Node List::GetNode(int i)
{
	List_Node p = head;
	int j = 1;  // 标记head结点位置值为1
	while (p && j < i)
	{
		p = p->next;
		j++;
	}
	if (!p||j>i)   // 当p为空或i=0时
		return NULL;
	return p;
}
void List::Delete_Node(int i)
{
	if (i == 1) //当删除头结点时
	{
		head = head->next;
		return;
	}
	List_Node p = GetNode(i-1);
	List_Node q = p->next;
	p->next = q->next;
	delete q;
}
void List::Insert_Node(int x, int i)
{
	if (i == 1) // 在链表头部插一个结点
	{
		List_Node t = new Node;
		t->data = x;
		t->next = head;
		head = t;
	}
	else
	{
		List_Node p = GetNode(i-1);  // 找到第i个结点的前驱
		List_Node temp = new Node;
		temp->data = x;
		temp->next = p->next;
		p->next = temp;
	}
	
}
List::~List()
{
	List_Node p=head;
	while (p)
	{
		head = p->next;
		delete p;
		p = head;
	}
	
}
int List::Locate_Elem(int e)
{
	List_Node p = head;
	int pos = 1;
	while (p != NULL)
	{
		if (p->data == e)
			return pos;
		else
		{
			p = p->next;
			pos++;
		}
	}
	return NO_FOUND;
}
int List::getLength()
{
	int cnt = 0;
	List_Node p = head;
	while (p != NULL)
	{
		cnt++;
		p = p->next;
	}
	return  cnt;
}

int main()
{
	List l;
	l.Init_List();
	l.Print_List();
	cout <<endl<< "你要删除第几个结点?" << endl;
	int i;
	cin >> i;
	if (i > l.getLength()||i<1)
	cout << "删除失败!" << endl;
	else
	{
	l.Delete_Node(i);
	l.Print_List();
	}
	
	cout << endl<<"请输入想要插入元素的值和插入的位置:";
	int x,pos;
	cin >> x>>pos;
	l.Insert_Node(x, pos);
	l.Print_List();

	cout << endl << "请输入想要查找元素的值:";
	int t;
	cin >> t;
	if (l.Locate_Elem(t) == NO_FOUND)
		cout << "不存在这个元素" << endl;
	else
		cout << "该元素在链表中处于第" << l.Locate_Elem(t) << "个" << endl;
}




猜你喜欢

转载自blog.csdn.net/qq_37174526/article/details/78011536