单链表的实现
#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW -2
#define ERROR -1
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void InitList_L(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
}
Status GetElem_L(LinkList L,int i,ElemType &e)
{
LinkList p;
int j=1;
p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList p,s;
int j=0;
p=L;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p && j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
if(!s)
exit(OVERFLOW);
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
LinkList p,q;
int j=0;
p=L;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)&&j>i-1)
return ERROR;
q=p->next;p->next=q->next;
e=q->data;
free(q);
return OK;
}
void CreatList_L1(LinkList &L,int n)
{
printf("\n逆位序输入\n");
LinkList s;
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
for(int i=1;i<=n;i++)
{
s=(LinkList)malloc(sizeof(LNode));
if(!s)
exit(OVERFLOW);
scanf("%d",&s->data);
s->next=L->next;
L->next=s;
}
}
void CreatList_L2(LinkList &L,int n)
{
printf("\n正位序输入\n");
LinkList s,p;
L=(LinkList)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
p=L;
for(int i=1;i<=n;i++)
{
s=(LinkList)malloc(sizeof(LNode));
if(!s)
exit(OVERFLOW);
scanf("%d",&(s->data));
s->next=p->next;p->next=s;p=s;
}
}
void MergeList_L(LinkList La,LinkList &Lb,LinkList &Lc)
{
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
Lc=pc=La;
while(pa&&pb)
{
if(pa->data <= pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
Lb=NULL;
}
void PrintN(LinkList L)
{
LinkList p;
p=L->next;
if(!p)
printf("该单链表为空");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
LinkList L1,L2,L3,L4;
ElemType e;
InitList_L(L1);
for(int i=1;i<=5;i++)
{
ListInsert_L(L1,i,i);
}
printf("L1:") ;
PrintN(L1);
printf("\n");
CreatList_L1(L2,6);
printf("L2:");
PrintN(L2);
printf("\n");
CreatList_L2(L3,6);
printf("L3:");
PrintN(L3);
printf("\n将L1,L3合并为L4");
MergeList_L(L1,L3,L4);
printf("\n");
printf("L4:");
PrintN(L4);
printf("\n");
ListDelete_L(L4,2,e);
printf("\n") ;
printf("从L4中删除了:%d\n",e);
printf("删除元素后的L4:");
PrintN(L4);
if(L1==L4)
{
printf("OK");
}
return 0;
}