读书人

c语言顺序表的简历合并归并算法实

发布时间: 2012-04-15 18:39:21 作者: rapoo

c语言顺序表的简历,合并,归并算法实现
线性表LA=(3,5,8,11),LB=(2,6,8,9,11,15,20);要求用顺序表实现,给出所用数据类型中每个操作的伪码算法 (1),若LA和LB分别表示两个集合A和B,求新集合A=A∪B,(即“并”操作,相同元素不保留);预测输出
LA=(3,5,8,11,2,6,9,5,20)。
(2)将LA与LB表归并,仍要有序,相同元素要保留,预测输出LC=(2,3,5,6,8,9,11,15,20)。

[解决办法]

C/C++ code
#include <stdio.h>#include <malloc.h>#include <stdlib.h>typedef struct node{    int data;    struct node *next;}linkNode, *linklist;/**功能:初始化链表*返回值:链表首地址*/linklist initList(){    linklist head;    head = (linklist)malloc(sizeof(linkNode));    if(head == NULL)        return NULL;    head->next = NULL;    return head;}/**功能:输出链表数据*参数:链表首地址*/void printList(linklist head){    if(head == NULL || head->next == NULL)        return;    head = head->next;    printf("\nlinklist:\n");    while(head != NULL)    {        printf("%d  ", head->data);        head = head->next;    }    printf("\n");}/**功能:申请空间*参数:结点(数据)*返回值:指向结点的指针*/linklist makeNode(linkNode nodeData){    linklist newNode;    newNode = (linklist)malloc(sizeof(linkNode));    if(newNode == NULL)        return NULL;    newNode->data = nodeData.data;    return newNode;}/**功能:在链表尾部插入结点*参数:链表首地址,待插入结点地址*/void pushBack(linklist head, linklist insertNode){    if(head == NULL)        return;    while(head->next != NULL)    {        head = head->next;    }    head->next = insertNode;    insertNode->next = NULL;}/**功能:合并链表*参数:两个链表首地址,合并后链表首地址*/void mergeLink(linklist La, linklist Lb, linklist Lc){    La = La->next;    Lb = Lb->next;    while (La && Lb)    {        if (La->data > Lb->data)//将data较小的连接到Lc        {            Lc->next = Lb;            Lb = Lb->next;        }        else if(La->data == Lb->data)        {            Lc->next = La;            La = La->next;            Lb = Lb->next;                    }        else        {            Lc->next = La;            La = La->next;                    }        Lc = Lc->next;            }    Lc->next = La ? La : Lb;//将La 或 Lb剩下的部分连接到Lc}int main(){    linklist La, Lb, Lc,insertNode;    linkNode newNode;    int dataA[] = {3,5,8,11};    int dataB[] = {2,6,8,9,11,15,20};    int i;    La = initList();    Lb = initList();    Lc = initList();    for(i = 0; i < 4; ++i)    {        newNode.data = dataA[i];        insertNode = makeNode(newNode);                pushBack(La, insertNode);    }    for(i = 0; i < 7; ++i)    {        newNode.data = dataB[i];        insertNode = makeNode(newNode);                pushBack(Lb, insertNode);    }    printList(La);    printList(Lb);    mergeLink(La, Lb, Lc);    printList(Lc);    system("pause");    return 0;} 

读书人网 >C语言

热点推荐