ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单链表的两种合并操作(C语言)

2021-03-16 19:34:51  阅读:361  来源: 互联网

标签:单链 Lnode list1 合并 next pb pa C语言 listA


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

/**
* 含头节点单链表定义及基本操作 
*/

//基本操作函数用到的状态码 
#define TRUE 1;
#define FALSE 0;
#define OK 1;
#define ERROR 0;

//Status函数返回值类型
typedef int Status; 
//数据元素类型
typedef int ElemType;
//单链表定义
typedef struct Lnode {
    ElemType data;        //数据域
    struct Lnode *next;    //指针域
} Lnode, *LinkList;


//基本操作1:单链表初始化 
Status InitList(LinkList *list) { 
    (*list)=(LinkList)malloc(sizeof(Lnode));
    (*list)->next=NULL;
    return OK;
}

//基本操作11:头插法建立链表,数据保存在ElemType类型的数组中 
Status CreateList_H(LinkList *list,ElemType arrData[],int length) {
    int j;
    for(j=length-1;j>=0;j--){
        //新建结点 
        Lnode *node;
        node=(Lnode*)malloc(sizeof(Lnode));
        node->data=arrData[j];
        node->next=NULL;
        //插入为1号结点 
        node->next=(*list)->next;
        (*list)->next=node;
    }
    return OK;
}

//基本操作13:链表元素遍历输出
Status ListTraverse(LinkList list) {
    Lnode *p;
    p=list;
    int j=0;
    printf("序号:    结点数据:\n");
    while(p->next){
        j++;
        p=p->next;
        printf(" (%d)          %d\n",j,p->data);
    }
    return OK;
}

//有序表合并,顺序表实现。pa,pb分别指向listA,listB首元,pc指向新链表表尾
Status MergeList(LinkList *listA,LinkList *listB) {
    Lnode *pa,*pb,*pc;
    pa=(*listA)->next;
    pb=(*listB)->next;
    pc=*listA;
    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;
    //释放listB头结点
    free(*listB);
    return OK;
}

//线性表合并,顺序表实现。pa,pb分别指向listA,listB首元
Status UnionList(LinkList *listA,LinkList *listB){
    Lnode *pa,*pb;  //ra将指向listA尾结点
    pa=(*listA);
    pb=(*listB);
    
    while(pb->next){
        ElemType data=pb->next->data;
        while(pa->next&&pa->next->data!=data){
            pa=pa->next;
        }
        if(pa->next&&pa->next->data==data){  //listA中有目标元素
            Lnode *needDelete=pb->next;
            pb->next=needDelete->next;
            free(needDelete);  //释放listB中的该结点
        } else {
            Lnode *needInsert=pb->next;  //pb->next指向当前结点
            //将该结点接入listA尾
            pa->next=needInsert;  //此时pa为listA的尾指针
            pb->next=pb->next->next;
            needInsert->next=NULL;  //listA的 最后结点->next 置空
        }
        pa=(*listA)->next;
    }
    free(*listB);  //释放listB头结点
    return OK;
}

/**
 * 已知线性表:
 * list1=(1,7,8),list2=(2,4,6,8,10,11)
 * 有序表合并:(这里为两个非递减线性表list1,list2;合并为一个非递减线性表,仍作为list1);
 * 则新的:list1=(1,2,4,6,7,8,8,10,11)
 * 线性表合并:(合并结果放入list1,“list1 并= list2”)
 * 则新的:list1=(1,7,8,2,4,6,10,11)
 */

int main(void){
    //定义链表
    LinkList list1,list2,list3,list4;
    
    //链表初始化
    InitList(&list1);
    InitList(&list2);
    InitList(&list3);
    InitList(&list4);
    
    //创建链表
    ElemType waitInserted1[]={1,7,8,};
    ElemType waitInserted2[]={2,4,6,8,10,11,};
    ElemType waitInserted3[]={1,7,8,};
    ElemType waitInserted4[]={2,4,6,8,10,11,};
    int arrLength1=sizeof(waitInserted1)/sizeof(waitInserted1[0]);
    int arrLength2=sizeof(waitInserted2)/sizeof(waitInserted2[0]);
    int arrLength3=sizeof(waitInserted3)/sizeof(waitInserted3[0]);
    int arrLength4=sizeof(waitInserted4)/sizeof(waitInserted4[0]);
    CreateList_H(&list1,waitInserted1,arrLength1);
    CreateList_H(&list2,waitInserted2,arrLength2);
    CreateList_H(&list3,waitInserted3,arrLength3);
    CreateList_H(&list4,waitInserted4,arrLength4);
    
    /*
    printf("\nlist1:\n");
    ListTraverse(list1);
    printf("\nlist2:\n");
    ListTraverse(list2);
    printf("\nlist3:\n");
    ListTraverse(list4);
    printf("\nlist3:\n");
    ListTraverse(list4);
    */
    
    //有序表合并
    MergeList(&list1,&list2);
    printf("\nlist1:(与list2经过有序表合并后)\n");
    ListTraverse(list1);  //遍历测试
    
    //线性表合并
    UnionList(&list3,&list4);
    printf("\nlist3:(与list4经过线性表表合并后)\n");
    ListTraverse(list3);  //遍历测试
    
    printf("\nEND");
    return 0;
}

 

标签:单链,Lnode,list1,合并,next,pb,pa,C语言,listA
来源: https://www.cnblogs.com/petitepluie/p/14545383.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有