c++单链表链表部分

#include<iostream>
using namespace std;

typedef struct _LinkNode {
	int data;  //节点的数据域
	struct _LinkNode* next; //结点的指针域
}LinkNode,LinkList; //链表节点,链表

//构造一个空的单链表
bool InitList(LinkList*& L)
{
	L = new LinkNode; //生产新节点作为头节点 用头指针L指向头节点
	if (!L)return false; //生成节点失败
	L->next = NULL;      //头节点的指针域置空
	return true;
}
//前插法
bool ListInsert_front(LinkList*& L, LinkNode* Node)
{
	if (!L || !Node) return false;

	Node->next = L->next;
	L->next = Node;
	return true;
}

//尾插法
bool ListInsert_back(LinkList*& L, LinkNode* Node)
{
	if (!L || !Node) return false;
	LinkNode* last = NULL;
	//找到最后一个节点
	last = L;
	while (last->next) last = last->next;
	Node->next = NULL;
	last->next = Node;
	return true;
}

//任意位置插入
bool LinkInsert(LinkList*& L, int i, int& e)
{
	//在带头节点的单链表L中的第i个位置插入值为e的新节点
	int j;
	LinkList* p, * s;

	p = L;
	j = 0;
	while (p && j < i - 1)//查找第i-1个节点,p指向该节点
	{
		p=p->next;
		j++;
	}
	if (!p || j > i - 1) {
		return false;
	}
	s = new LinkNode; //生产新的节点
	s->data = e;      //将新节点的数据域置为e
	s->next = p->next;//将新节点的指针域指向节点
	p->next = s;      //将节点p的指针域指向结点s
	return true;
}
//单链表的便利
void LinkPrint(LinkList*& L) //单链表的输出
{
	LinkNode* p;
	p = L->next;

	while (p)
	{
		cout << p->data << "\t";
		p = p->next;
	}

	cout << endl;
}
bool Link_GetElem(LinkList*& L, int i, int& e) //单链表的取值
{
	//带头结点的单链表L中查找第i个元素
	//用e记录L中第i个数据元素的值
	int j;
	LinkList* p;
	p = L->next; //p指向第一个节点
	j = 1;
	//顺着链表向后扫描 直到p指向第i个元素
	//或者p不存在
	while (p && j < i) {
		p = p->next;
		j++;
	}
	if (!p || j > i) {
		return false;
	}
	e = p->data;  //取第i个节点的数据域
	return true;
}

//单链表中查找元素
bool Link_FindElem(LinkList* L, int e,int &index) //按值查找
{
	//在带头结点的单链表中查找值为e的元素
	LinkList* p;
	p = L->next;
//没有找到就一直往后找
	while (p&& p->data != e) {
		index++;
		p = p->next;
	}
	//查找失败 p为NULL
	if (!p) return false;  
	return true;
}

//单链表中删除元素
bool LinkDelete(LinkList*& L, int i) {
	//在带头结点的单链表L中,删除第i个为位置
	LinkList* p,*q;
	int j = 1;
	p = L->next;

	if (!L || !L->next) { return false; }
	while (p->next && j < i-1)
	{
		p = p->next;
		j++;
	}
	if (!p->next || j > i - 1) {
		return false;
	}
	q = p->next;
	p->next = q->next;
	
	delete q;//释放被删除节点的空间
	return true;
}


void LinkDestroy(LinkList*& L)//单链表的销毁
{
	//定义临时节点p指向头节点
	LinkList* p = L;
	cout << "销毁链表中。。。。。。。。。" << endl;
	while (p)
	{
		L = L->next; //L指向下一个节点
		cout << "删除元素:" << p->data << endl;
		delete p; //删除当前节点
		p = L;    //p移向下一个节点
	}
}

int main() {
	LinkList* L = NULL;
	LinkNode* s = NULL;

	//1.初始化一个空的链表
	InitList(L);

	//2.使用前插法插入数据
	int n;
	cout << "前插法创建单链表" << endl;
	cout << "请输入插入元素的个数:";
	cin >> n;
	while (n--)
	{
		s = new LinkNode; //生成新节点s
		cin >> s->data;
		ListInsert_front(L, s);
	}
	//3. 使用尾插法插入数据
	/*int n;
	cout<<"尾插法创建单链表"<<endl; 
	cout<<"请输入元素个数 n:";
	cin>>n; 
	cout<<"\n 请依次输入 n 个元素:" <<endl; 
	while(n>0){
	s = new LinkNode; //生成新节点 s 
	cin>>s->data;
	ListInsert_back(L, s);
	n--; 
	}
	*/
	//4.单链表的输出
	LinkPrint(L);
	//5.在任意位置插入元素
	for (int j = 0; j < 3; j++) { 
		int i, x;
		cout << "请输入插入的位置和元素(用空格隔开):"; 
		cin >> i;
		cin >> x;
		if (LinkInsert(L, i, x)) {
			cout << "插入成功.\n\n";
		} else { 
			cout << "插入失败!\n\n"; 
		}
		LinkPrint(L); 
	}
	//6.单链表根据位置获取元素
	int element = 0;
	if (Link_GetElem(L, 2, element)) { 
		cout << "获取第二个元素成功, 值:" << element << endl; 
	}
	else { 
		cout << "获取第二个元素失败!" << endl;
	}
	//7. 单链表根据值查询元素所在的位置
	int index=0;
	if (Link_FindElem(L, 10, index)) { 
		cout << "查找元素 10 存在,所在位置: " << index << endl;
	}
	else { 
		cout << "不存在元素 10." << endl;
	}
	//8. 单链表删除元素 
	if(LinkDelete(L, 2)){
		cout<<"删除第 2 个元素成功!"<<endl; 
		LinkPrint(L);
	}else {
		cout<<"删除第 2 个元素失败!"<<endl;
	}
	//9. 销毁单链表
	LinkDestroy(L);
	system("pause"); 
	return 0;
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐