仅供参考!
#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;
}