数据结构与算法中单链表的部分操作

本人最近在练习数据结构与算法,对链表的相关操作进行了学习,其中包括

链表的初始化

单链表的头插法创建方法

单链表的尾插法创建方法

单链表中单个元素的删除

单链表的释放

单链表的打印

在后面会把自己编写的相关代码贴在后面,与大家分享,相互交流,共同提高!希望自己的代码能对看到此文的人有所帮助。


#include<iostream>
#include<stdlib.h>

using namespace std;

typedef int ElemType;

//构建结构体
typedef struct node{
	ElemType data;
	struct node* next;
}NODE,*PNODE;

//初始化链表
NODE *initnode(); 
//单链表的建立1,头插法建立链表 
NODE *HeadCreatList(); 
//单链表的建立2,尾插法建立链表
NODE *TailCreatList(); 
//删除链表中的指定元素 
NODE *DelList(NODE *phead,int data);
//释放链表
NODE *ClearList(NODE *phead);

//打印链表
void Print(NODE *phead); 
int main()
{
	cout<<"***********************************************"<<endl;
	cout<<"***********************************************"<<endl;
	cout<<"******     0    退出              *************"<<endl;
	cout<<"******     1    头插法创建链表    *************"<<endl;
	cout<<"******     2    尾插法创建链表    *************"<<endl;
	cout<<"******     3    删除指定的元素    *************"<<endl;
	cout<<"******     4    打印链表          *************"<<endl;
	cout<<"******     5    释放链表          *************"<<endl;
	cout<<"***********************************************"<<endl;
	cout<<"***********************************************"<<endl;
	cout<<"请根据以上提示输入数字:"; 
	NODE *phead;
	ElemType data;
	int set; 
	cin>>set;
	while(set)
	{
		if(1 == set)
		   phead = HeadCreatList();	
		else if(2 == set)
		   phead = TailCreatList();
		else if(3 == set)
		   {
		   	cout<<"输入你要删除的元素:";
         	cin>>data;
		   	phead = DelList(phead,data);
		   }
		else if(4 == set)
		   Print(phead);
		else if(5 == set)
		   phead = ClearList(phead);
		cin>>set;
	}
	return 0;
}


//初始化链表
NODE *initnode()
{
	NODE *L = (NODE *)malloc(sizeof(NODE));        //申请节点空间 
	if(NULL == L)
	   cout<<"内存空间申请失败!"<<endl;
	L->next = NULL;
}

//单链表的建立1,头插法建立链表 
NODE *HeadCreatList()
{
	cout<<endl<<"用头插法建立链表,请依次输入链表元素,每输入一个元素需按“enter(回车)”键,输入“-1”结束输入"<<endl; 
	NODE *L = (NODE *)malloc(sizeof(NODE));   //初始化节点 
	L->next = NULL;
	ElemType x;
	cin>>x;
	while(x != -1)
	{
		NODE *p = (NODE *)malloc(sizeof(NODE));  //申请新的节点 
		p->data = x;
		p->next = L->next;
		L->next = p;
		cin>>x;
	}
	cout<<"头插法建立链表成功!输入“4”可打印查看!"<<endl; 
	return L;
}

//单链表的建立2,尾插法建立链表
NODE *TailCreatList()
{
	NODE *L = (NODE *)malloc(sizeof(NODE));    //初始化新节点 
	L->next = NULL;
	NODE *ptemp = L;
	cout<<endl<<"用尾插法建立链表,请依次输入链表元素,每输入一个元素需按“enter(回车)”键,输入“-1”结束输入"<<endl;
	ElemType x; 
	cin>>x;
	while(-1 != x)
	{
		NODE *p = (NODE *)malloc(sizeof(NODE)); //申请新节点 
		
		p->data = x; 
		p->next = NULL;
		ptemp->next = p;
		ptemp = ptemp->next;
		cin>>x;
	}
	cout<<"尾插法建立链表成功!输入“4”可打印查看!"<<endl;
	return L;
}

//删除链表中的指定元素 
NODE *DelList(NODE *phead,int data)
{
	NODE *ptemp = phead;   //新建节点,以对链表进行操作 
	NODE *pt;              //中间操作节点 
	if(NULL == ptemp->next)
		cout<<"此链表为空无法进行删除操作"<<endl;
	else if(data == ptemp->next->data)     //假如要删除的元素在第一个位置 
		{
			pt = ptemp->next;
			phead->next = ptemp->next->next;
			free(pt);
		}
	else  //不在第一个位置,进行查找 
		{     
			while(NULL != ptemp->next->next  && ptemp->next->next->data != data)
				{
					ptemp = ptemp->next; 
				 } 
				 //未找到
			 if(NULL == ptemp->next->next) 
				 {
				 	cout<<"在链表中未找到这个元素!删除失败,原链表为"<<endl;
				 }
				 //如果是最后一个元素 
			 else if(NULL == ptemp->next->next->next && ptemp->next->data == data)
				 {
				 	 pt = ptemp->next->next;
				 	 free(pt);
					 ptemp->next->next = NULL;
					 cout<<"尾插法建立链表成功!输入“4”可打印查看!"<<endl;
				 }
			 else//如果在中间 
				 {
				 	pt = ptemp->next->next;
				 	ptemp->next->next = ptemp->next->next->next;
				 	free(pt);
				 	cout<<"尾插法建立链表成功!输入“4”可打印查看!"<<endl;
				 }
			
		 }
	return phead;
}

 
 //释放链表
NODE *ClearList(NODE *phead)
{
	NODE *ptemp;
	if(NULL == phead->next)
	  cout<<"此链表为空,无需释放"<<endl;
	else 
	 {
	 while(phead->next != NULL)
		 {
		 	ptemp = phead->next;
		    phead->next = ptemp->next;
		    free(ptemp);
		 }
	 cout<<"链表释放成功!"<<endl;
	 }
	 return phead;
}
 
//打印链表 
void Print(NODE *phead)
{
	NODE *ptemp;
	ptemp = phead;
	if(NULL == ptemp->next)
		cout<<"链表为空"<<endl;
	while(NULL != ptemp->next)
	{
		cout<<ptemp->next->data<<" ";
		ptemp = ptemp->next;
	}
	cout<<endl<<"打印完毕"<<endl; 
}

本文可免费转载,转载请注明出处。http://blog.csdn.net/qq_37949021/article/details/79617035



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值