数据结构——c++链表

数据结构——c++链表

链表菜单

#include<iostream>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1  //不可实行的
#define OVERFLOW -2   //溢出  
using namespace std;

typedef int Status;

typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}LinkNode,*LinkList;

void createNode(LinkList &head);
void destroyNode(LinkList &head);
Status numberNode(LinkList head);
Status locateElem(LinkList head,int l,int &s1);
Status location(LinkNode &N,int l,int &s2);
Status former(LinkList head,int e,int &s3);
Status later(LinkList head,int e,int &s4);
Status insert(LinkList &head,int l,int e); 
Status remove(LinkList &head,int l);
Status coutelem(LinkList &head);
Status cinelem(LinkList &head,int n);
void clear(LinkList &head);

int success=0;
int num666;

int main()
{
	int choose=0;
	LinkList head;
	head=(LinkList)malloc(sizeof(LinkNode));
	head->data=0;
	head->next=NULL;
	while(1)
	{
		cout<<"1----初始化(创建)或重置链表"<<endl;
		cout<<"2----销毁链表"<<endl;
		cout<<"3----链表中数据的元素个数"<<endl;
		cout<<"4----所指位序的元素值"<<endl;
		cout<<"5----链表已存在元素的位序"<<endl;
		cout<<"6----请输入元素,求直接前驱"<<endl;
		cout<<"7----请输入元素,求直接后继"<<endl;
		cout<<"8----在第i个位置插入元素"<<endl;
		cout<<"9----删除第i个元素"<<endl;
		cout<<"10----输出所有的链表元素"<<endl;
		cout<<"11----初始化并输入链表元素"<<endl;
		cout<<"12----清空链表"<<endl;
		cout<<"0----退出"<<endl;
		cout<<"请选择"<<endl;
		cin>>choose;
		switch(choose)
		{
			case 1:
				{
					createNode(head);
					cout<<"初始化成功"<<endl;
				}
				break;
			case 2:
				{
					if(success==1)
					{
						destroyNode(head);
						cout<<"摧毁成功"<<endl;
					}
					else
					{
						cout<<"尚未初始化"<<endl; 
					}
				}
				break;
			case 3:
				{
					int i;
					if(success==1)
					{
						numberNode(head);
						cout<<"元素个数为"<<num666<<endl;
					}
					else
					{
						cout<<"尚未初始化"<<endl; 
					}
					
				}
				break;
			case 4:
				{
					int i,j;
					if(success==1)
					{
						int s1;
						cout<<"请输入位序"<<endl;
						cin>>i;
						locateElem(head,i,s1);
						if(i<1||i>num666)
						{
							cout<<"输入错误"<<endl;
						}
						else{
						cout<<"该位置的元素为:"<<s1<<endl; 
						}
						
					}
					else
					{
						cout<<"尚未初始化"<<endl; 
					}
				}
				break;
			case 5:
				{
					int i,j,s2;
					if(success==1)
					{
						cout<<"请输入元素"<<endl;
						cin>>j;
						i=location(*head,j,s2);
						if(i==0)
						{
							cout<<"未查找到"<<endl;
						}
						else
						{
							cout<<"位序为:"<<s2<<endl; 
						} 
					}
					else{
						cout<<"尚未初始化"<<endl;
					}
				}
				break;
			case 6:
				{
					if(success==1)
					{
						LinkList p;
						p=head;
						int i,j,s3;
						bool yes;
						cout<<"请输入元素"<<endl;
						cin>>j; 
						while(p->next!=NULL)
						{
							p=p->next;
							if(p->data==j)
							{
								yes=true;
								break;
							} 
						}
						if(yes)
						{
							if(head->next->data==j)
							{
								cout<<"无前驱"<<endl; 
							}
							else
							{
								former(head,j,s3);
								cout<<"前驱为"<<s3<<endl;
							}
						}
						else
						{
							cout<<"没有该元素"<<endl;
						}
			
					}
					else
					{
						cout<<"尚未初始化"<<endl;
					}
				}
				break;
			case 7:
				{
					if(success==1)
					{
						LinkList p,q;
						p=head;
						bool yes;
						int i,j,s4,asd;
						cout<<"请输入元素"<<endl;
						cin>>j; 
						asd=later(head,j,s4);
						if(asd==0)
						{
							cout<<"出错"<<endl; 
						}
						else
						{
							cout<<"后继为:"<<s4<<endl;
						}	
				}
				else{
					cout<<"尚未初始化"<<endl;
				}
			}
				break;
			case 8:
				{
					if(success==1)
					{
						int i,j,k;
						cout<<"请依次输入要插入的位置和元素"<<endl;
						cin>>j;
						cin>>k; 
						i=insert(head,j,k);
						if(i==-1)
						{
							cout<<"输入位置有误"<<endl;
						}
						if(i==1)
						{
							cout<<"插入成功"<<endl;
						} 
					} 
					
					else
					{
						cout<<"尚未初始化"<<endl;
					}
				} 
				break;
			case 9:
				{
					if(success==1)
					{
						int i,j,k;
						cout<<"请输入要删除的位序"<<endl;
						cin>>j;
						i=remove(head,j);
						if(i==-1)
						{
							cout<<"删除位置有误"<<endl;
						}
						else if(i==1)
						{
							cout<<"删除成功"<<endl;
						}
					} 
					else
					{
						cout<<"尚未初始化"<<endl;
					}
				
				}
				break;
			case 10:
			{
				if(success==1)
				{
					int ak=coutelem(head);
					if(ak==0)
					{
						cout<<"空表"<<endl;
					}
				}
				else
				{
					system("CLS");
					cout<<"尚未初始化"<<endl;
					
				}
			 } 
			 break;
			case 11:
				{
					int i,j,k;
					cout<<"输入元素个数"<<endl;
					cin>>j;
					system("CLS");
					cout<<"请输入"<<endl;
					int akk=cinelem(head,j);
					if(akk==1)
					{
						cout<<"输入成功"<<endl;
					}
					success=1;
				}
				break;
			case 12:
				{
					if(success==1)
					{
						clear(head);
						cout<<"清空成功"<<endl;
					}
					else
					{
						cout<<"尚未初始化"<<endl;
					} 
				}
				break;
			case 0:
				{
					return 0;
				}
			default:
				{
					cout<<"输入错误"<<endl;
					break;
				}
		}
	}
}

//1初始化(创建)或重置链表
void createNode(LinkList &head)
{
	LinkList p;
	p=new LinkNode;
	p->data=0;
	p->next=NULL;
	head=p;
	success=1;
	system("CLS");
}
//2销毁链表
void destroyNode(LinkList &head)
{ 
	LinkList p=head->next;
	while(p!=NULL){
		head->next=p->next;
		free(p);
		p=head->next;
	}
	free(head);
	head=NULL;
		success=0;
		system("CLS");
}
//3链表中数据的元素个数
Status numberNode(LinkList head)
{
		system("CLS");
		return OK;
}
//4所指位序的元素值
Status locateElem(LinkList head,int l,int &s1)
{
		LinkList p;
		p=head;
		if(l<1&&l>num666)
		{
			return ERROR;
		}
		else
		{
			int num=0;
			while(p->next!=NULL)
			{
				p=p->next;
				num++;
				if(num==l)
				{
					s1=p->data;
					system("CLS");
					return OK;
				}
			}
		}
}
//5链表已存在元素的位序
Status location(LinkNode &N,int l,int &s2)
{
		LinkList p;
		p=&N;
		int num=0;
		while(p->next!=NULL)
		{
			p=p->next;
			num++;
			if(p->data==l)
			{
				s2=num;
				system("CLS");
				return TRUE;
			}
		}
		system("CLS");
		return FALSE;
}
//6请输入元素,求直接前驱
Status former(LinkList head,int e,int &s3)
{
	
		LinkList p,q;
		p=head;
		while(p->next!=NULL)
		{
			q=p;
			p=p->next;
			if(p->data==e)
			{
				s3=q->data;
				system("CLS");
				return OK;
			}
		}
		system("CLS");
		return ERROR;
} 
//7请输入元素,求直接后继
Status later(LinkList head,int e,int &s4)
{
		LinkList p,q;
		p=head;
		while(p->next->next!=NULL)
		{
			p=p->next;
			q=p->next;
			if(p->data==e)
			{
				s4=q->data;
				return OK;
			}
		}
		return ERROR;
}
//8在第i个位置插入元素
Status insert(LinkList &head,int l,int e)
{
		LinkList p,q;
		int location=0;
		p=head;
		q=new LinkNode;
		q->data=e;
		if(l<1||l>num666+1)
		{
			system("CLS");
			return INFEASIBLE;
		}
		else
		{
			while(p->next!=NULL)
			{
				location++;
				if(location==l)
				{
					break;
				}
				p=p->next;
			}
			q->next=p->next;
			p->next=q;
			num666++;
			system("CLS");
			return OK;
		}
}
//9删除第i个元素
Status remove(LinkList &head,int l)
{
		LinkList p,q;
		q=head;
		p=q->next; 
		int location=1;
		if(l<1||l>num666)
		{
			return INFEASIBLE;
		}
		else
		{
			while(p!=NULL)
			{
				if(l==location)
				{
					break;
				}
				
				q=p;
				p=p->next;
				location++;
			}	
			q->next=p->next;
			free(p);
			num666--; 
			system("CLS");
			return OK;
		}
}
//10输出所有的链表元素
Status coutelem(LinkList &head)
{
		LinkList p;
		p=head;
		int num555=0;
		if(p->next==NULL)
		{
			system("CLS");
			return FALSE;
		}
		else
		{
		system("CLS");
		for(int num555=0;num555<num666;num555++)
		{
			p=p->next;
			cout<<p->data<<"  ";
		}
		}
		cout<<endl;
		return OK;
}
//11初始化并输入链表元素
Status cinelem(LinkList &head,int n)
{/*代码逻辑错误 
	success=1;
	LinkList p,q;
	p=(LinkList)malloc(sizeof(LinkNode));
	p->data=0;
	p->next=NULL;
	head=p;
	num666=0;
	while(num666!=n)
	{
		q=(LinkList)malloc(sizeof(LinkNode));
		cin>>q->data;
		p->next=q;
		p=q;
		num666++;
	}
	return OK;*/
	success=1;
	LinkList p,q;
	q=head;
	num666=0;
	for(num666=0;num666<n;num666++){
		p=(LinkList)malloc(sizeof(LinkNode));
		if(p==NULL){
			return ERROR;
		}
		cin>>p->data;
		p->next=q->next;
		q->next=p;
		q=p;
	}
	return OK;
}
//12清空链表
void clear(LinkList &head)
{
	LinkList p=head->next;
	while(p!=NULL){
		head->next=p->next;
		free(p);
		p=head->next;
	}
	system("CLS");
}







特别注意:
仅供参考学习,转载请附上原文链接
分享学习心得,如有侵权,望联系本人处理
还在读大学的程序员,项目经验少,如有纰漏,感谢指正
需要源代码请联系本人
谢谢配合

如果这篇文章对您有帮助,小小的点个赞,算是给小学弟的鼓励吧!谢谢大佬!!/呱呱.jpg

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值