单链表,双向循环链表应用

//1单链表得简单那应用
#include<iostream>
#include<malloc.h>
using namespace std;
#define false 0;
#define true 1;
typedef struct ElemType{
		char name[30];
		char mobile[30];
		char addr[30];
}ElemType;
typedef struct LNode{
        ElemType data;
		LNode* next;
}LNode,*LinkList;



//带头节点得链表初始化操作
bool initLinkList(LinkList &L)
{
	L=(LNode*)malloc(sizeof(LNode));
	if(L)
	{
		L->next=NULL;
		return true;
	}
	else
		return false;
}

//判断单链表是否为空,空返回true,否则返回false
bool IsEmpty(LinkList &L)
{
	if(!(L->next))
		return 1;
	else
		return false;

}

//查看链表得长度
int Length(LinkList L)
{

	int length=0;
	LNode* p=L->next;
	while(p)
	{
		++length;
		p=p->next;
	}
	return length;
}




//找到第i个节点所在的位置,p只想第i个元素的前驱
bool SearchPre(LinkList L,int i,LNode* p)
{
	if(!L)
		return false;
	if(i>Length(L)+1||i<1)
		return false;
	p=L;
	for(;i>1;--i)
		p=p->next;
}


//在第i个节点前加入元素元素



bool Insert(LinkList &L, int i,ElemType e)
{
	//位置不合理
	if(i<1||i>Length(L)+1)
	//cout<<"Insert fail,because the index is not true!"<<endl;
		return false;
	//为待插入元素分配空间
	LNode* elem=(LNode*)malloc(sizeof(LNode));
	elem->data=e;
	LNode* p=NULL;
	SearchPre(L,i,p);
	elem->next=p->next;//插入
	p->next=elem;
	return true;
}


//头插法





bool Insert(LinkList& L,ElemType e)
{
	LNode* p=(LNode*)malloc(sizeof(LNode));
	p->data=e;
	p->next=L->next;
	L->next=p;
	return 1;
	
}

//按姓名删除元素
bool deleteNode(LinkList &L,char* name)
{
	int flag=0;
	LNode *p= L->next;
	LNode *pre= L;//始终指示p的前驱
	if(!p) return false;
	while(p)
	{
		//delete所有的name域为给定值得元素。
		if(!strcmp(name,p->data.name))
		{
			pre->next=p->next;
			free(p);
			p=pre->next;	
			flag=1;
		}
		else
		{
			p=p->next;
			pre=pre->next;
		}
	}
	if(flag)
		return 1;
	else
		return false;

}
//按姓名查找元素
bool search(LinkList L,LNode *&result,char* name)
{
	LNode* p=L->next;
	if(!p)
		return false;
	while(p)
	{
		if(!strcmp(name,p->data.name))
		{
			result=p;
			return true;
		}
		else
			p=p->next;
	}
	return false;
}


//输出所有元素的值
void print(LinkList L)
{
	LNode * p=L->next;
	while(p)
	{
		cout<<"联系人为:"<<p->data.name<<",电话号码为:"<<p->data.mobile<<",家庭住址为:"<<p->data.addr<<endl;
		p=p->next;
	}
}


void destory(LinkList& L)
{
	LNode* p=L->next;
	if(!p)
		return ;
	L->next=NULL;
	LNode*q=p->next;
	while(p)
	{
		free(p);
		p=q;
		q=q->next;
	}
}




void main()
{
	int judge=0;
	int choice=0;
	ElemType elem;
	//char *phoneNumber=new char[30];
	char name[30];
	LinkList L;
	initLinkList(L);
	cout<<"请选择相关操作:1代表查询表中元素,2表中元素个数,3代表插入元素,4代表删除元素操作,5代表退出"<<endl;
	while(scanf("%d",&choice)!=EOF)
	{
		
		if(choice==1)
		{
			cout<<"请输入要查询对象的名字:";
			cin>>name;
			LNode *p=NULL;
			judge=search(L,p,name);
			if(judge)
			{
				cout<<name<<"的信息为:"<<(*p).data.mobile<<", "<<(*p).data.addr<<endl;

			}
			else
				cout<<"表中没有你要查找的元素"<<endl;
		}
			
		else if(choice==2)
			cout<<"表中元素为"<<Length(L)<<"个"<<endl;
		else if(choice==3)
		{

			cout<<"请输入需要插入的相关信息。"<<endl;
			cout<<"姓名:";

			cin>>elem.name;
			cout<<"电话号码:";
			cin>>elem.mobile;
			cout<<"家庭地址:";
			cin>>elem.addr;
			if(Insert(L,elem))
			{
				cout<<"插入成功!"<<endl;
				print(L);
			}
			else
				cout<<"插入失败!"<<endl;

		}
		else if(choice==4)
		{
			cout<<"请输入要删除人物的姓名:";
			cin>>name;
			if(deleteNode(L,name))
				cout<<"删除成功!"<<endl;
			else
				cout<<"表中不含该人物!删除失败"<<endl;

		}
		else
		{
			destory(L);
			return ;
		}


	}
}
上述是单链表写的电话本简单应用。
//2再写一个双向循环链表的应用
#include<iostream>
#include<malloc.h>
using namespace std;
#define false 0;
#define true 1;
typedef struct DNode{
 ElemType data;
 DNode*   prior;
 DNode*   next;
}DNode,*DLinkList;
<p>typedef struct ElemType{
  char name[30];
  char mobile[30];
  char addr[30];
}ElemType;</p><p> </p><p>初始化带头节点的双向循环链表
bool InitDList(DLinkList& L)
{
 L=(DNode*)malloc(sizeof(DNode));
 if(L)
 {
  L->prior=L;
  L->next=L;
  return true;
 }
 else
  return false;
}</p><p> </p><p>bool IsEmpty(DLinkList L)
{
 if(L->prior==L&&L->next==L)
  return 1;
 else
  return false;
}</p><p>
表中元素个数
int Length(DLinkList L)
{
 int length=0;
 if(IsEmpty(L))
  return length;
 DNode* p=L;
 while(p->next!=L)
 {
  length++;
  p=p->next;
 }
 return length;
}</p><p>插入元素
bool Insert(DLinkList &L,ElemType e)
{
 DNode *elem=(DNode*)malloc(sizeof(DNode));
 if(!elem)
 {
  cout<<"节点创建失败,overflow"<<endl;
  return false;
 }
 elem->data=e;
 elem->next=L->next;
 elem->prior=L;
 L->next->prior=elem;
 L->next=elem;
 return 1;
}</p><p>删除元素
bool deleteNode(DLinkList &L,char* name)
{
 DNode*p=L->next;
 if(p==L)
 {
  cout<<"表中没有元素,无法删除!"<<endl;
  return false;
 }
 while(p!=L)
 {
  if(!strcmp(p->data.name,name))
  {
   p->prior->next=p->next;
   p->next->prior=p->prior;
   free(p);
   return 1;
  }
  p=p->next;
 }
 return false;
}
按名字查找
bool search(DLinkList L,char*name)
{
 DNode* p=L->next;
 while(p!=L)
 {
  if(!strcmp(name,p->data.name))
  {
   cout<<name<<"的信息为:电话号码"<<p->data.mobile<<",地址为:"<<p->data.addr<<endl;
   return 1;
  }
  else
   p=p->next;
 }
 cout<<"表中不含该联系人信息。"<<endl;
 return false;
}</p><p>
打印
void print(DLinkList L)
{
 DNode *p=L->next;
 if(p==L)
 {
  cout<<"该表为空表!"<<endl;
  return ;
 }
 while(p!=L)
 {
  cout<<"姓名:"<<p->data.name<<",电话:"<<p->data.mobile<<",地址:"<<p->data.addr<<endl;
  p=p->next;
 }
}</p><p>void distory(DLinkList& L)
{
 DNode* p=L->next;
 DNode* q=p->next;
 while(p!=L)
 {
  free(p);
  p=q;
  q=q->next;
 }
}</p><p> </p><p>int main()
{
 int judge=0;
 ElemType elem; 
 char name[30];
 int choice=0;
 DLinkList L;
 InitDList(L);
 cout<<"请选择相关操作:1代表查询表中元素,2表中元素个数,3代表插入元素,4代表删除元素操作,5代表查看表中所有元素,6代表退出"<<endl;
 while(scanf("%d",&choice)!=EOF)
 {
  if(choice==1)
  {
   cout<<"请输入要查询对象的名字:";
   cin>>name;
   DNode *p=NULL;
   search(L,name);
  }
   
  else if(choice==2)
   cout<<"表中元素为"<<Length(L)<<"个"<<endl;
  else if(choice==3)
  {</p><p>   cout<<"请输入需要插入的相关信息。"<<endl;
   cout<<"姓名:";</p><p>   cin>>elem.name;
   cout<<"电话号码:";
   cin>>elem.mobile;
   cout<<"家庭地址:";
   cin>>elem.addr;
   if(Insert(L,elem))
   {
    cout<<"插入成功!"<<endl;
    print(L);
   }
   else
    cout<<"插入失败!"<<endl;</p><p>  }
  else if(choice==4)
  {
   cout<<"请输入要删除人物的姓名:";
   cin>>name;
   if(deleteNode(L,name))
    cout<<"删除成功!"<<endl;
   else
    cout<<"表中不含该人物!删除失败"<<endl;</p><p>  }
  else if(choice==5)
  {
   print(L);
  }
  else
  {
   distory(L);
   return 1;
  }</p><p> }</p><p> </p><p>}</p>
上述1,2两个文件均为cpp文件,可直接运行,后续会更新二叉排序树得类似应用。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值