有序链表的合并和删除

                                                   有序链表的合并和删除
采用头插法或尾插法建立链表,从键盘输入递增有序的数据建立链表,编写算法实现有序链表 LIST1 和 LIST2 合并为一个 LIST3,要求LIST3 仍然是递增有序的链表,并对 LIST3 链表删除值相同的结点,即若链表中有多个结点具有相同的数据域值,只保留其中一个结点,其余的均从链表中删去,使得最后得到的链表中的所有节点的数据域都不相同,具有以下功能菜单:
(1) 建立链表的算法;
(2) 合并有序链表的算法;
(3) 删除相同结点的算法;
(4) 输出链表;

源代码:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct Node{
    int data;
    struct Node * next;
};
typedef struct Node * TNode;
TNode create();
void Insert(TNode list,int data);
void Print(TNode list);
void Combin(TNode , TNode ,TNode );
int main(){
    TNode list1,list2,list3;
    list1 = create();
    list2 = create();
    list3 = create();
    int data;
    printf("请输入list1的数据(以回车结束):");
    while(1){
        scanf("%d",&data);
        Insert(list1,data);
        if(getchar()=='\n') break;
}
    Print(list1);
    printf("请输入list2的数据:");
    while(1){
        scanf("%d",&data);
        Insert(list2,data);
        if(getchar()=='\n') break;
    }
    Print(list2);
    Combin(list1,list2,list3);
    Print(list3);
    return 0;
}
TNode create(){
    TNode head;
    head = (TNode)malloc(sizeof(struct Node));
    head->data = NULL;
    head->next = NULL;
    return head;
}
void Insert(TNode list,int data){
    TNode pin,plist;
    pin = (TNode)malloc(sizeof(struct Node));
    pin->data=data;
    pin->next=NULL;
    if(data==NULL) {printf("输入为空\n"); return ;}
    plist = list;
    while(plist->next!=NULL){
        plist=plist->next;
    }
    plist->next=pin;
}
void Print(TNode list){
    TNode p;
    p=list->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
void Combin(TNode list1, TNode list2,TNode list3){
    TNode p1,p2,head;
    p1=list1->next;
    p2=list2->next;
    head = list3;
    while(1){
    if (p1==NULL&&p2==NULL)  return ; //都为空,退出
    else if(p1==NULL&&p2!=NULL){  //list1空
        head->next=p2;
        head=head->next;
        p2=p2->next;
    }
    else if(p2==NULL&&p1!=NULL){//list2空
        head->next ==p1;
        p1=p1->next;
        head = head->next;
    }
    else {
            if(p1->data<p2->data){//list1小于list2
            head->next=p1;
            head = head->next;
            p1 = p1->next;
        }
        else if (p1->data>p2->data){//list1大于list2
                head->next=p2;
                head = head->next;
                p2 = p2->next;
        }
        else if(p1->data==p2->data){  //list1等于list2
            head->next = p1;
            head = head->next;
            p1 = p1->next;
            p2 = p2->next;
            }
    }
   }
}

猜你喜欢

转载自blog.csdn.net/huang1600301017/article/details/85621836