数据结构—— 两个有序链表序列的合并

yclzju 2017-03-17 12:52:42
02-线性结构1 两个有序链表序列的合并 (15分)
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

函数接口定义:

List Merge( List L1, List L2 );
其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */

List Merge( List L1, List L2 );

int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}


//将两个链表表示的递增整数序列合并为一个非递减的整数序列
List Merge( List L1, List L2 ){
List L;
List head;
List Tmp,Tmp1,Tmp2;
Tmp1 = L1->Next;
Tmp2 = L2->Next;
head = ( List )malloc( sizeof( struct Node ) );
Tmp = head;

while( Tmp1 || Tmp2 ){
L = ( List )malloc( sizeof( struct Node ) );
//若Tmp1为NULL,则将Tmp2->Data复制给L
if( !Tmp1 ){
L->Data = Tmp2->Data;
Tmp2 = Tmp2->Next;
}
else if( !Tmp2 ){
L->Data = Tmp1->Data;
Tmp1 = Tmp1->Next;
}

else{
//注意要求为非递减,故条件为<=,若为递增则改为<
//且增加二者相等时
if( Tmp1->Data <= Tmp2->Data ){
L->Data = Tmp1->Data;
Tmp1 = Tmp1->Next;
}

else if( Tmp2->Data < Tmp1->Data ){
L->Data = Tmp2->Data;
Tmp2 = Tmp2->Next;
}
}
Tmp->Next = L;
Tmp = L;
}
//由于结束后L1 L2输出为NULL,故empty L1和L2
L1->Next = NULL;
L2->Next = NULL;

return head;
}

//题中省略此部分,为方便调试,自行写一个
List Read(){
List head;
List p;
List r;
int n;
head = (List) malloc( sizeof( struct Node ) ) ;
r = head;

scanf( "%d",&n);
while( n-- ){
p = (List) malloc( sizeof( struct Node ) );
scanf( "%d", &p->Data );
r->Next = p;
r = p;
}
r->Next = NULL;
return head;
}

void Print( List L ){
List p;
p = L->Next;
if( p == NULL ){
printf("NULL\n");
return;
}

while( p ){
printf( "%d",p->Data );
p = p->Next;
if( p )
printf(" ");
}
printf("\n");
}
...全文
888 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-03-17
  • 打赏
  • 举报
回复 1
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;

struct Node {
    ElementType Data;
    PtrToNode   Next;
};

typedef PtrToNode List;

List Read();
void Print(List L);

List Merge(List L1, List L2);
List my_merge_link(List hd1, List hd2);

int main()
{
    List L1, L2, L;
    L1 = Read();
    L2 = Read();

    Print(L1);
    Print(L2);
    /*
    L = Merge(L1, L2);
    Print(L);
    */
    L = my_merge_link(L1, L2);
    Print(L);
    return 0;
}


List my_merge_link(List hd1, List hd2)
{
    List pcur, pcur1, pcur2;
    List hd;

    pcur1 = hd1->Next;
    pcur2 = hd2->Next;
    hd = (List)malloc(sizeof(struct Node));
    pcur = hd;

    while (pcur1 && pcur2) {
        if (pcur1->Data < pcur2->Data) {
            pcur->Next = pcur1;
            pcur = pcur1;
            pcur1 = pcur1->Next;
        } else {
            pcur->Next = pcur2;
            pcur = pcur2;
            pcur2 = pcur2->Next;
        }
    }

    if (pcur1) {
        pcur->Next = pcur1;
        pcur = pcur1;
        pcur1 = pcur1->Next;
    }
    if (pcur2) {
        pcur->Next = pcur2;
        pcur = pcur2;
        pcur2 = pcur2->Next;
    }


    return hd;
}


//将两个链表表示的递增整数序列合并为一个非递减的整数序列
List Merge(List L1, List L2)
{
    List L;
    List head;
    List Tmp, Tmp1, Tmp2;

    Tmp1 = L1->Next;
    Tmp2 = L2->Next;
    head = (List)malloc( sizeof( struct Node ) );
    Tmp = head;



    while( Tmp1 || Tmp2 ){
        L = ( List )malloc( sizeof( struct Node ) );
        //若Tmp1为NULL,则将Tmp2->Data复制给L
        if( !Tmp1 ){
            L->Data = Tmp2->Data;
            Tmp2 = Tmp2->Next;
        }
        else if( !Tmp2 ){
            L->Data = Tmp1->Data;
            Tmp1 = Tmp1->Next;
        }

        else{
            //注意要求为非递减,故条件为<=,若为递增则改为<
            //且增加二者相等时
            if( Tmp1->Data <= Tmp2->Data ){
                L->Data = Tmp1->Data;
                Tmp1 = Tmp1->Next;
            }

            else if( Tmp2->Data < Tmp1->Data ){
                L->Data = Tmp2->Data;
                Tmp2 = Tmp2->Next;
            }
        }
        Tmp->Next = L;
        Tmp = L;
    }
    //由于结束后L1 L2输出为NULL,故empty L1和L2
    L1->Next = NULL;
    L2->Next = NULL;

    return head;
}

//题中省略此部分,为方便调试,自行写一个
List Read(){
    List head;
    List p;
    List r;
    int n;
    head = (List) malloc( sizeof( struct Node ) ) ;
    r = head;

    printf("Please input the number of nodes: ");
    scanf( "%d",&n);
    while(n--){
        p = (List) malloc( sizeof( struct Node ) );
        printf("Pleaes input data: ");
        scanf("%d", &p->Data );
        r->Next = p;
        r = p;
    }
    r->Next = NULL;
    return head;
}

void Print( List L ){
    List p;
    p = L->Next;
    if( p == NULL ){
        printf("NULL\n");
        return;
    }

    while( p ){
        printf( "%d",p->Data );
        p = p->Next;
        if( p )
            printf(" ");
    }
    printf("\n");
}
my_merge_link函数

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧