C++数据结构-链表

仅供参考!

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

#define ok 1;
#define error 0;

typedef int Status;

typedef int ElemType;
typedef struct List{
	ElemType elem;
	struct List* next;
}List;

List* Initial()
{
	List *p,*head;
	/*while( head!=NULL )
	{
		p=head->next;
		free(head);
		head=p;
	}*/
	head=(List*)malloc(sizeof(List));
	head->next=NULL;
	return head; 
} 
Status Destroy( List *head )
{//销毁线性表即将链表中的所有元素释放 
	List *p;
	while( head )
	{
		p=head->next;
		free(head);
		head=p;
	}
	return ok;
}
Status Clear( List *head )
{//清空线性表即保留头指针,释放其余元素 
	List *p,*pre;
	pre=head->next;
	while( pre!=NULL )
	{
		p=pre;
		pre=pre->next;
		free(p);
	}
	head->next=NULL;
	return ok;
}
int ListLength( List *head )
{
	int count=0;
	List *p;
	p=head;
	while( p->next!=NULL )
	{
		 p=p->next;
		 count++;
	}
	return count;
}

int GetelemByIndex( List *head,int x )
{
	List *p;
	int count=1,flag=0;
	p=head;
	while( p!=NULL )
	{
		 p=p->next;
		 if( count==x )
		 {
		 	flag=1;
		 	count=p->elem; 
		 	break;
		 }
		 count++;
	}
	if( flag==0 )
		count=-1;
	return count;
}

int GetIndexByelem( List *head,int x )
{
	List *p;
	int index=-1,flag=0;
    //index用来以循环的次数来标记元素的位置,flag用来标记找没找到该元素 
	p=head;
	while( p->next!=NULL )
	{
		p=p->next;
		index++;
		if( p->elem==x )
		{
			flag=1;
			break;
		}
	}
	if( flag==0 )
    //若未找到该元素,则继续令index=-1 
		index=-1;
	return index+1;
}

int Getfront( List *head,int x )
{
	List *p;
	int Elem=-1,flag=0;
    //Elem来记录前驱元素,flag用来标记找没找到该元素
	p=head;
	while( p->next!=NULL )
	{
		p=p->next;
		if( p->elem==x )
		{
			flag=1;
			break;
		}
		Elem=p->elem;
	}
	if( flag==0 )
    //若未找到该元素,则令Elem=-2,Elem=-1为该元素无前驱元素 
		Elem=-2;
	return Elem;
}
int Getbehind( List *head, int x )
{
	List *p;
	int Elem=-1,flag=0;
    //Elem来记录后继元素,flag用来标记找没找到该元素
	p=head->next;
	while( p->next!=NULL )
	{
		if( p->elem==x )
		{
			flag=1;
			Elem=p->next->elem;
			break;
		}
		p=p->next;
	}
	if( flag==0 )
    //若未找到该元素,则令Elem=-2,Elem=-1为该元素无后继元素
	{
		Elem=-2;
		return Elem;
	}
	if( p->elem!=x )
	{
		Elem=-1;
		return Elem;
	}
	return Elem;
}
Status Insert( List *head,int Il,int El )
{
	List *p,*pre;
	int count=0;
	pre=head;
	while( pre!=NULL )
	{
		 count++;
		 if( count==Il )
		 	break;
		 pre=pre->next;
	}
	p=(List*)malloc(sizeof(List));
	p->next=pre->next;
	p->elem=El;
	pre->next=p;
	return ok;
}
Status Delete( List *head,int Il )
{
	List *p,*pre;
	int count=0;
	pre=head;
	while( pre!=NULL )
	{
		 count++;
		 if( count==Il )
		 	break;
		 pre=pre->next;
	}
	p=pre->next;
	pre->next=p->next;
	free(p);
	return ok;
}
Status Output( List *head )
{
	List *p;
	p=head->next;
	while( p!=NULL )
	{
		cout<<p->elem<<"  ";
		p=p->next;
	}
	cout<<endl;
	return ok;
}
List* Initial_Insert()
{
	List *p,*pre,*head;
	int x;
	/*while( head!=NULL )
	{
		p=head->next;
		free(head);
head=p;
	}*/
	head=(List*)malloc(sizeof(List));
	head->next=NULL;
	pre=head;
	while( 1 )
	{
		cin>>x;
		if( x==-1 )
			break;
		p=(List*)malloc(sizeof(List));
		p->elem=x;
		p->next=NULL;
		pre->next=p;
		pre=p;
	}
	return head;
}
Status Deserialized( List *head )
{
	List *pre,*p,*q;
	pre=head;
	p=head->next;//找到"第一个"节点 ,并记录 
	while( p->next!=NULL )
	{
		q=p->next;
		p->next=q->next;
		q->next=pre->next;
		pre->next=q;
	}
	return ok;
}

int main()
{
	int n,x;    //x为要进行操作的位置 
	int Ll;    //即Listlength,用来记录通过 Listlength()方法调用以后的链表的长度
	int El;    //即Elem,用来记录通过 GetelemByIndex()方法调用以后得到的元素值
	int Il;    //即存在元素的位置,若链表中存在则返回位置
	List *head=NULL;
	while( 1 )
	{
		cout<<"可执行的操作有:"<<endl;
		cout<<"+---------------------------------------------------+"<<endl;
		cout<<"|        1.初始化或重置链表                         |"<<endl;
		cout<<"|        2.销毁链表                                 |"<<endl;
		cout<<"|        3.清空链表                                 |"<<endl;
		cout<<"|        4.链表长度                                 |"<<endl;
		cout<<"|        5.指定位置的元素值                         |"<<endl;
		cout<<"|        6.链表已存在元素的位序                     |"<<endl;
		cout<<"|        7.求输入元素的直接前驱                     |"<<endl;
		cout<<"|        8.求输入元素的直接后继                     |"<<endl;
		cout<<"|        9.在第i个位置插入一个元素                  |"<<endl;
		cout<<"|       10.删除第i个元素                            |"<<endl;
		cout<<"|       11.输出所有的链表元素                       |"<<endl;
		cout<<"|       12.初始化并用头插法(或尾插法)输入元素     |"<<endl;
		cout<<"|       13.实现单链表的逆序存放                     |"<<endl;
		cout<<"+---------------------------------------------------+"<<endl;
		cout<<"请输入你的选择:";
		cin>>n;
		if( n<1 || n>13 )
			cout<<"请输入合理的功能选项!"<<endl;
		else
		{
			switch( n )
			{
				case 1:
					head=Initial();
					cout<<"初始化或重置链表完成!"<<endl;
					break;
				case 2:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,不用进行销毁操作!"<<endl;
						break;
					}
					Destroy(head);
					head=NULL;
					cout<<"链表已被销毁!"<<endl;
					break;
				case 3:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,不能进行清空!"<<endl;
						break;
					}
					if( head->next==NULL )
					{
						cout<<"链表为空,不用进行清空操作!"<<endl;
						break;
					}
					Clear(head);
					cout<<"链表初始化或重置成功!"<<endl<<endl;
					break;
				case 4:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,不能计算长度!"<<endl;
						break;
					}
					if( head->next==NULL )
					{
						cout<<"链表为空,长度为0!"<<endl;
						break;
					}
					Ll=ListLength(head);
					cout<<"该线性表的长度为:"<<Ll<<endl;
					break;
				case 5:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,不能进行查找操作!"<<endl;
						break;
					}
					if( head->next==NULL )
					{
						cout<<"链表为空,不能进行查找操作!"<<endl;
						break;
					}
					cout<<"请输入要查找的位置:" ;
					cin>>x;
					if( x<1 || x>ListLength(head) )
					{
						cout<<"输入的位置不在线性表的范围之内!"<<endl;
						break; 
					}
					El=GetelemByIndex(head,x);
					cout<<"该位置的元素的值为:"<<El<<endl;
					break;
				case 6:
					if( head->next==NULL )
					{
						cout<<"链表为空,不能进行查找操作!"<<endl;
						break;
					}
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,不能进行查找操作!"<<endl;
						break;
					}
					cout<<"请输入元素的值:";
					cin>>x;
					Il=GetIndexByelem(head,x);
					if( Il>0 )
						cout<<"该元素在整个链表的第"<<Il<<"个位置"<<endl;
					else
						cout<<"链表中没有该元素,请重新查找!"<<endl; 
					break;
				case 7:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,不能进行查找操作!"<<endl;
						break;
					}
					if( head->next==NULL )
					{
						cout<<"链表为空,不能进行查找操作!"<<endl;
						break;
					}
					cout<<"请输入元素的值:";
					cin>>x;
					El=Getfront(head,x);
					if( El==-1 )
						cout<<"该元素没有前驱元素!"<<endl;
					else if( El==-2 )
						cout<<"未在链表中找到该元素"<<endl;
					else
						cout<<"该元素的前驱元素为:"<<El<<endl; 
					break;
				case 8:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,不能进行查找操作!"<<endl;
						break;
					}
					if( head->next==NULL )
					{
						cout<<"链表为空,不能进行查找操作!"<<endl;
						break;
					}
					cout<<"请输入元素的值:";
					cin>>x;
					El=Getbehind(head,x);
					if( El==-1 )
						cout<<"该元素没有后继元素!"<<endl;
					else if( El==-2 )
						cout<<"未在链表中找到该元素!"<<endl;
					else
						cout<<"该元素的后继元素为:"<<El<<endl;
					break;
				case 9:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,不能进行插入操作!"<<endl;
						break;
					}
					cout<<"可以插入的位置为:(1 ~"<<ListLength(head)+1<<")"<<endl;
					cout<<"请输入要插入的位置:";
					cin>>Il;
					if( Il<1 || Il>ListLength(head)+1 )
					{
						cout<<"输入的位置有误,请重新操作!"<<endl;
						break; 
					}
					cout<<"请输入要插入的值:";
					cin>>El;
					Insert(head,Il,El);
					cout<<"插入成功!"<<endl;
					break;
				case 10:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,不能进行删除操作!"<<endl;
						break;
					}
					if( head->next==NULL )
					{
						cout<<"链表为空,不能进行删除操作!"<<endl;
						break;
					}
					cout<<"可以删除的位置为:(1 ~"<<ListLength(head)<<")"<<endl;
					cout<<"请输入要删除的位置:";
					cin>>Il;
					if( Il<1 || Il>ListLength(head) )
					{
						cout<<"输入的位置有误,请重新操作!"<<endl;
						break; 
					}
					Delete(head,Il);
					cout<<"删除成功!"<<endl;
					break;
				case 11:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,没有元素!"<<endl;
						break;
					}
					if( head->next==NULL )
					{
						cout<<"链表为空,没有可以输出的元素!"<<endl;
						break;
					}
					cout<<"该链表的元素为:"<<endl; 
					Output(head);
					break;
				case 12:
					cout<<"链表即将重置或初始化"<<endl;
					cout<<"输入一系列数,以-1为结束的标志:"<<endl;
					head=Initial_Insert();
					break;
				case 13:
					if( head==NULL )
					{
						cout<<"链表未初始化或已被销毁,无法实现链表的逆序存放!"<<endl;
						break;
					}
					if( head->next==NULL )
					{
						cout<<"链表为空,无法实现链表的逆序存放!"<<endl;
						break;
					}
					Deserialized(head);
					cout<<"链表逆序存放已实现!"<<endl;
					break;
			}
		}
		system("pause");
		system("cls"); 
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值