#include
#include
#include
#include
//函数结果状态代码
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//Status是函数返回值类型,其值是函数结果状态代码
typedef int Status;
//ElemType是线性表数据元素类型,本程序处理整型数据
typedef int ElemType;
//定义
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
//初始化
Status InitList(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
//取值
Status GetElem(LinkList L,int i,ElemType &e)
{
int j;
LinkList p=L->next;
j=1;
while(p&&jnext;
++j;
}
if(!p||j>i)return ERROR;
e=p->data;
return OK;
}
//按值查找
LNode *LocateElem(LinkList L,ElemType e)
{
LinkList p=L->next;
while(p&&p->data!=e)
p=p->next;
return p;
}
//插入
Status ListInsert(LinkList &L,int i,ElemType e)
{
int j;
LinkList p=L;j=0;
while(p&&(jnext;++j;}
if(!p||j>i-1) return ERROR;
LinkList s=new LNode;
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
//删除
Status ListDelete(LinkList &L,int i)
{
LinkList p=L;int j=0;
while((p->next)&&(jnext;++j;}
if(!(p->next)||(j>i-1)) return ERROR;
LinkList q=p->next;
p->next=q->next;
delete q;
return OK;
}
//前插法创建单链表
void CreateList_H(LinkList &L,int n)
{
L=new LNode;
L->next=NULL;
for(int i=0;idata;
p->next=L->next;L->next=p;
}
}
//后插法创建单链表
void CreateList_R(LinkList &L,int n)
{
L=new LNode;
L->next=NULL;
LinkList r=L;
for(int i=0;idata;
p->next=NULL;r->next=p;
r=p;
}
}
//两个有序单链表的合并
void MergeList_L(LinkList &LA,LinkList &LB,LinkList &LC)
{
LinkList pa=LA->next;
LinkList pb=LB->next;
LC=LA;
LinkList pc=LC;
while(pa&&pb)
{
if(pa->datadata)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
delete LB;
}
//单链表的遍历
void Printout(LinkList L)
{
LinkList L1=L->next;
while(NULL!=L1){
printf("%d",L1->data);
L1=L1->next;
}
printf("\n");
return ;
}
//单链表的释放
void DestroyList(LinkList &L){
LinkList p;
while(NULL!=L)
{
p=L;
L=L->next;
free(p);
}
return;
}
void main()
{
LinkList MyList;
int i;
ElemType e;
int c;
while(true)
{
printf("------------单链表的基本操作操作----------\n");
printf("--------------1.单链表的初始化---------------\n");
printf("--------------2.单链表的取值------------------\n");
printf("--------------3.单链表的按值查找---------------------\n");
printf("--------------4.单链表的插入------------------\n");
printf("--------------5.单链表的删除---------------------\n");
printf("--------------6.前插法创建单链表---------------------\n");
printf("--------------7.后插法创建单链表---------------------\n");
printf("--------------8.两个有序单链表的合并------------------------------\n");
printf("--------------9.单链表的遍历------------------------------\n");
printf("--------------10.单链表的释放------------------------------\n");
printf("请输入要操作的步骤:\n");
scanf("%d",&c);
switch(c)
{
case 1: if(InitList(MyList)==OK)
{
printf("链式表初始化成功!\n");
}
else
{
printf("链式表初始化失败!\n");
}
break;
case 2:
printf("\n请输入您需要取值的位置:\n");
scanf("%d",&i);
if(GetElem(MyList,i,e)!=0)
{
printf("您需要取值的位置对应的值为");
printf("%d", GetElem(MyList,i,e));
printf("\n");
}
else{
printf("取值失败\n");
}
break;
case 3:
printf("\n请输入您需要查询的数据元素:\n");
scanf("%d",&e);
if(LocateElem(MyList,e))
{
printf("查询元素在第");
printf("%d", LocateElem(MyList,e));
printf("个位置\n");
}
else{
printf("查询失败\n");
}
break;
case 4:
printf("\n请输入您需要插入的数据以及它的位置:");
scanf("%d%d",&e,&i);
printf("\n您需要插入的数据是%d\n您要插入的位置是:%d\n",e,i);
if(ListInsert(MyList,i,e))
{
printf("插入成功!\n");
printf("插入后的链表排序为:\n");
Printout(MyList);
printf("\n");
}
else{
printf("插入失败!\n");
}
break;
case 5:
printf("\n请输入您需要删除元素的位置:");
scanf("%d",&i);
if(ListDelete(MyList,i))
{
printf("删除成功\n");
printf("删除后的链表为:\n");
Printout(MyList);
printf("\n");
}
else{
printf("删除失败\n");
}
break;
case 6:
case 7:
case 8:
case 9:
Printout(MyList);
printf("\n");
break;
case 10:
DestroyList(MyList);
break;
case 11:exit(0);
default:printf("输入有错误!");
}
}
} |