单链表的增删查改等基本操作C++实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表的增删查改等基本操作C++实现相关的知识,希望对你有一定的参考价值。

单链表的初始化、增删查改、遍历一次找中间结点、删除一个无头单链表的非尾结点(不给头结点)

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;
typedef struct ListNode
{
	struct ListNode* _next;
	DataType _data;
}ListNode;
void InitList(ListNode* &pHead)
{
	pHead=NULL;
}
ListNode* CreatNode(DataType x)
{
	ListNode* tmp;
	tmp=(ListNode*)malloc(sizeof(ListNode));
	tmp->_data=x;
	tmp->_next=NULL;
	return tmp;
}
void PushFront(ListNode* &pHead,DataType x)
{
	ListNode* NewNode;
	if(pHead==NULL)
	{
		pHead=CreatNode(x);
		return;
	}
	else
	{
		NewNode=CreatNode(x);
		NewNode->_next=pHead;
		pHead=NewNode;
	}
}
void PushBack(ListNode* &pHead,DataType x)
{
	ListNode* tmp=CreatNode(x);
	if(pHead==NULL)
	{
		pHead=tmp;
		return;
	}
	else
	{
		ListNode* p=pHead;
		while(p->_next)
		{
			p=p->_next;
		}
		p->_next=tmp;
	}
}
void PopFront(ListNode* &pHead)
{
	if(pHead==NULL)
	{
		printf("链表为空");
		return;
	}
	else
	{
		pHead=pHead->_next;
	}
}
void PopBack(ListNode* &pHead)
{
	if(pHead==NULL)
	{
		printf("链表为空\n");
		system("pause");
		exit(0);
	}
	else if(pHead->_next==NULL)
	{
		pHead=NULL;
	}
	else
	{
		ListNode* tmp=pHead;
		while(tmp->_next->_next)
		{
			tmp=tmp->_next;
	    }
		tmp->_next=NULL;
	}
}
ListNode* Find(ListNode* pHead,DataType x)
{
	if(pHead==NULL)
	{
		printf("链表为空\n");
		system("pause");
		exit(0);
	}
	else
	{
		ListNode* tmp=pHead;
		while((tmp->_data!=x)&&(tmp->_next!=NULL))
		{
			tmp=tmp->_next;
		}
		if(tmp->_data==x)
		{
			return tmp;
		}
		else
		{
			printf("想找的数据不存在\n");
			system("pause");
			exit(0);
		}
	}
}
void Insert(ListNode* pos,DataType x)
{
	ListNode* NewNode=CreatNode(x);
	NewNode->_next=pos->_next;
	pos->_next=NewNode;
}
void Erase(ListNode* &pHead,ListNode* pos)
{
	while(pHead->_next!=pos)
	{
		pHead=pHead->_next;
	}
	pHead->_next=pos->_next;
}
//遍历一次找中间结点
ListNode* Cheak_MidNode(ListNode* pHead)
{
	ListNode* p1=pHead;
	ListNode* p2=pHead;
	int count=0;
	while(p1->_next)
	{
		p1=p1->_next;
		count++;
		if(count%2==0)
		{
			p2=p2->_next;
		}
	}
	return p2;
}
//删除一个无头单链表的非尾节点(不给头节点)
void Delete_NoHeadNode(ListNode* pos)
{
	pos->_data=pos->_next->_data;
	pos->_next=pos->_next->_next;
}
void Print(ListNode* pHead)
{
	while(pHead)
	{
		printf("%d->",pHead->_data);
		pHead=pHead->_next;
	}
	printf("NULL\n");
}
void Print_Node(ListNode* pHead,ListNode* pos)
{
	while(pHead!=pos)
	{
		pHead=pHead->_next;
	}
	printf("中间结点为:%d\n",pos->_data);
}
void Test1()
{
	ListNode* pHead;
	InitList(pHead);
	/*PushFront(pHead,1);
	PushFront(pHead,2);
	PushFront(pHead,3);*/
	PushBack(pHead,1);
	PushBack(pHead,2);
	PushBack(pHead,3);
	/*PopFront(pHead);
	PopFront(pHead);
	PopFront(pHead);
	PopFront(pHead);*/
	/*PopBack(pHead);
	PopBack(pHead);
	PopBack(pHead);
	PopBack(pHead);*/
	Print(pHead);
}
void Test2()
{
	ListNode* pHead;
	InitList(pHead);
	PushBack(pHead,1);
	PushBack(pHead,2);
	PushBack(pHead,3);
	ListNode* pos=Find(pHead,2);
	//ListNode* pos=Find(pHead,5);
	Insert(pos,7);
	Print(pHead);
	Erase(pHead,pos);
	Print(pHead);
}
void Test3()
{
	ListNode* pHead;
	InitList(pHead);
	PushBack(pHead,1);
	PushBack(pHead,2);
	PushBack(pHead,3);
	PushBack(pHead,4);
	PushBack(pHead,5);
	ListNode* pos=Cheak_MidNode(pHead);
	Print(pHead);
	Print_Node(pHead,pos);
}
void Test4()
{
	ListNode* pHead;
	InitList(pHead);
	PushBack(pHead,1);
	PushBack(pHead,2);
	PushBack(pHead,3);
	PushBack(pHead,4);
	Print(pHead);
	ListNode* pos=Find(pHead,3);
	Delete_NoHeadNode(pos);
    Print(pHead);
}
int main()
{
	//Test1();
	//Test2();
	//Test3();
	Test4();
	system("pause");
	return 0;
}


本文出自 “sunshine225” 博客,请务必保留此出处http://10707460.blog.51cto.com/10697460/1754730

以上是关于单链表的增删查改等基本操作C++实现的主要内容,如果未能解决你的问题,请参考以下文章

c++单链表构造函数运算符重载析构函数增删查改等

数据结构之顺序表的增删查改等操作详解

数据结构学习笔记(数据结构概念顺序表的增删查改等)详细整理

单链表~增删查改(附代码)~简单实现

单链表的链式存储总结

单链表的(增删查改)的实现