資料結構_兩個有序單鏈表歸併C語言原始碼
阿新 • • 發佈:2019-02-06
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;;
}LNode;
void InitList(LNode *&L)
{
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
}
void CreateListR(LNode *&L,int a[],int n)
{
int i;
LNode *r=L,*s=NULL;
for(i=0;i<n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void VisitList(LNode *L)
{
LNode *s=L->next;
while(NULL!=s)
{
printf("%d\n",s->data);
s=s->next;
}
}
void ListDelete(LNode *&L,int elem)
{
LNode *s=L;
LNode *q=NULL;
while(s->next!=NULL)
{
if(s->next->data==elem)
{
q=s->next;
s->next=q->next;
free(q);
return ;
}
s=s->next;
}
}
void MergeListR(LNode *A,LNode *B,LNode* &C)//採用尾插法建表的連結串列歸併 演算法 (A,B為遞增連結串列,C要求為單調不減連結串列)
{
LNode *r=NULL;
LNode *p=A->next;
LNode *q=B->next;
C=A;
C->next=NULL;
r=C;
free(B);
//B=NULL;
while(p!=NULL && q!=NULL)
{
if(p->data <= q->data)
{
r->next=p;
r=p;
p=p->next;
}
else
{
r->next=q;
r=q;
q=q->next;
}
r->next=NULL;
}
if(NULL==p)
{
r->next=q;
}
else
{
r->next=p;
}
}
int main(void)
{
const int N=5;
int a[N]={2,3,4,5,6};
int b[N]={2,4,7,8,9};
LNode *L,*S,*T;
InitList(L);
InitList(S);
CreateListR(L,a,N);
CreateListR(S,b,N);
VisitList(L);
putchar(10);
VisitList(S);
MergeListR(L,S,T);
VisitList(T);
system("pause");
return 0;
}
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;;
}LNode;
void InitList(LNode *&L)
{
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
}
void CreateListR(LNode *&L,int a[],int n)
{
int i;
LNode *r=L,*s=NULL;
for(i=0;i<n;i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void VisitList(LNode *L)
{
LNode *s=L->next;
while(NULL!=s)
{
printf("%d\n",s->data);
s=s->next;
}
}
void ListDelete(LNode *&L,int elem)
{
LNode *s=L;
LNode *q=NULL;
while(s->next!=NULL)
{
if(s->next->data==elem)
{
q=s->next;
s->next=q->next;
free(q);
return ;
}
s=s->next;
}
}
void MergeListR(LNode *A,LNode *B,LNode* &C)//採用尾插法建表的連結串列歸併 演算法 (A,B為遞增連結串列,C要求為單調不減連結串列)
{
LNode *r=NULL;
LNode *p=A->next;
LNode *q=B->next;
C=A;
C->next=NULL;
r=C;
free(B);
//B=NULL;
while(p!=NULL && q!=NULL)
{
if(p->data <= q->data)
{
r->next=p;
r=p;
p=p->next;
}
else
{
r->next=q;
r=q;
q=q->next;
}
r->next=NULL;
}
if(NULL==p)
{
r->next=q;
}
else
{
r->next=p;
}
}
int main(void)
{
const int N=5;
int a[N]={2,3,4,5,6};
int b[N]={2,4,7,8,9};
LNode *L,*S,*T;
InitList(L);
InitList(S);
CreateListR(L,a,N);
CreateListR(S,b,N);
VisitList(L);
putchar(10);
VisitList(S);
MergeListR(L,S,T);
VisitList(T);
system("pause");
return 0;
}