(数据结构)单向链表的表示

头文件:

#include"stdlib.h"
#include"iostream.h"
typedef  int status;
typedef  int ElemType; 
//链表节点及链表数据表示定义
typedef struct SingleLinkNode{
	ElemType data;					 //代表数据域
	struct SingleLinkNode *next;     //代表指针域,指向直接后继元素
}SingleLinkNode,*SingleLinkList;
//以下是单向链表操作函数原型


status InitSingleLinkList(SingleLinkList &l);//初始化操作
void DestroySingleLinkList(SingleLinkList &l);//链表销毁操作
void ClearSingleLinkList(SingleLinkList &l);//链表清除操作
int SingleLinkListLength(SingleLinkList l);//链表长度
bool SingleLinkListEmpty(SingleLinkList l);//链表是否为空
status GetSingleLinkListElem(SingleLinkList l,int i,ElemType &e);//取链表中的第i个元素
status InsertSingleLinkList(SingleLinkList &l,int i,ElemType e);//在链表的第i个位置插入元素
status DeleteSingleLinkList(SingleLinkList &l,int i);//删除链表的第i个元素
void PrintSingleLinkList(SingleLinkList l);//打印链表


//初始化操作
status InitSingleLinkList(SingleLinkList &l)
{
	//生成一个SingleLinkNode型的头结点,同时将该结点的起始位置赋给指针变量l
	l=(SingleLinkList)malloc(sizeof(SingleLinkNode));
	l->next=NULL;
	if(l)		//如果分配成功,设置节点
	{
		SingleLinkList p;
		p=(SingleLinkList)malloc(sizeof(SingleLinkNode));
		cout<<"请输入第一个元素值:";
		cin>>p->data;
		l->next=p;
		p->next=NULL;
		cout<<"初始化分配成功!"<<endl;
		return 1;
	}
	else
	{
		cout<<"分配失败!"<<endl;
		return 0;
	}
}

//链表长度
int SingleLinkListLength(SingleLinkList l)
{
	SingleLinkList p;
	int i=0;
	p=l->next;
	if(l==NULL)
	{
		cout<<"该链表长度为零!"<<endl;
		return 0;
	}
	while(p)
	{
		i++;
		p=p->next;
	}
	return i;
}

//链表销毁操作
void DestroySingleLinkList(SingleLinkList &l)
{	
	if(l)	//首先链表存在
	{
		SingleLinkList p;
		while(l)			//销毁是先销毁链表的头,再一个一个销毁后面
		{
			p=l->next;
			free(l);
			l=p;
		}
		if(!l)
		{
			cout<<"链表已销毁!"<<endl;
		}
		else
		{
			cout<<"链表未被销毁!"<<endl;
		}
	}
	else
	{
		cout<<"链表不存在,无法进行链表销毁操作!"<<endl;
	}
}

//链表清除操作
void ClearSingleLinkList(SingleLinkList &l)
{
	if(l)     //首先链表存在
	{
		SingleLinkList p=l->next,q;   
		while(p)				
		{
			q=p->next;			
			free(p);
			p=q;
		}
		l->next=NULL;
		cout<<"清空操作完成!"<<endl;
	}
	else
	{
		cout<<"链表不存在,无法进行链表清空操作!"<<endl;
	}
}


//链表是否为空
bool SingleLinkListEmpty(SingleLinkList l)
{
	if(l->next==NULL)
	{
		cout<<"链表为空!"<<endl;
		return 0;
	}
	else
	{
		cout<<"链表不为空!"<<endl;
		return 1;
	}
}

//取链表中的第i个元素
status GetSingleLinkListElem(SingleLinkList l,int i,ElemType &e)
{
	int k=0;
	SingleLinkList p=l->next;
	if(i<1||i>SingleLinkListLength(l)) //判断不在链表的规定位置以内
	{
		cout<<"该链表不存在该位置!"<<endl;	
		return 0;
	}
	while(p&&k<i-1)
	{
		k++;
		p=p->next; 
	}
	e=p->data;
	cout<<"存在第"<<i<<"个元素的值为:"<<e<<endl;
	return 1;
}

//在链表的第i个位置插入元素
status InsertSingleLinkList(SingleLinkList &l,int i,ElemType e)
{
	int k=0;
	SingleLinkList p,q;  
	if(SingleLinkListLength(l)==0)
	{
		InitSingleLinkList(l);
	}
	p=l;
	//1,寻找第i个结点
	if(i<1||i>SingleLinkListLength(l)+1) //不能在第0位和length+1的位置插入 
	{
		cout<<"插入位置不允许!所以"<<e<<"插入不成功"<<endl;
		return 0;
	}
	while(p->next && k<i-1)
	{
		k++;
		p=p->next; 
	}
	//2,构造结点
	if(!(q=(SingleLinkList)malloc(sizeof(SingleLinkNode))))
	{
		cout<<"构造结点不成功!"<<endl;
		return 0;
	}
	//3,设置结点并将结点链入
	q->data =e;
	q->next =p->next;
	p->next =q;
	cout<<"插入"<<e<<"成功!"<<endl;
	return 1;
}
//删除链表的第i个元素
status DeleteSingleLinkList(SingleLinkList &l,int i)
{
	int k=1;  //注意k值
	SingleLinkList p=l->next,q;
	if(i<1||i>SingleLinkListLength(l)) 
	{
		cout<<"删除位置不正确!"<<endl;
		return 0;
	}
	//1,寻找第i-1个结点
	if(i>1)
	{
		while(p && k<i-1)
		{
			k++;
			p=p->next;
		}
		q=p->next;
		p->next =q->next ;
		free(q);
		cout<<"删除第"<<i<<"个元素成功!"<<endl;
		return 1;
	}
	else
	{
		q=p->next;
		l->next=q;
		free(p);
		cout<<"删除第"<<i<<"个元素成功!"<<endl;
		return 1;
	}
}

//打印链表
void PrintSingleLinkList(SingleLinkList l)
{
	SingleLinkList p=l->next;
	while(p)
	{
		cout<<p->data<<",";
		p=p->next;
	}
	cout<<endl;
}

源文件:

#include"SingleLinkList.h"
void main()
{
	SingleLinkList M;
	ElemType e;
	InitSingleLinkList(M);  //初始化  
	SingleLinkListEmpty(M);
	InsertSingleLinkList(M,1,20);  // 插入
	InsertSingleLinkList(M,1,25);  // 插入
	InsertSingleLinkList(M,1,2); // 插入
	InsertSingleLinkList(M,1,11);// 插入
	InsertSingleLinkList(M,1,19);// 插入
	InsertSingleLinkList(M,1,8);// 插入
	InsertSingleLinkList(M,10,66);// 插入失败
	PrintSingleLinkList(M); // 输出链表
	GetSingleLinkListElem(M,6,e);  // 得到元素
	GetSingleLinkListElem(M,0,e);  // 得到错误位置元素
	DeleteSingleLinkList(M,10);// 删除错误位置元素
	DeleteSingleLinkList(M,1);// 删除元素
	cout<<"删除后的链表为:";
	PrintSingleLinkList(M);  // 输出链表
	SingleLinkListEmpty(M);  // 链表是否为空
	ClearSingleLinkList(M);// 清空链表
	SingleLinkListEmpty(M); // 链表是否为空
	DestroySingleLinkList(M);// 销毁链表
	cout<<endl;
}

效果截图:
运行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值