c语言 将两个单项链表合并且删除重复元素(9)

在这里插入图片描述
代码实现:

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

//将l2合并到l1中. 同时l1 l2中都有的元素,就不再归并到l1中
//又是链表合并 只不过合并的时候删除相同的元素~

typedef struct node
{
	int data;
	struct node * next;

}Node;

typedef struct list
{
	Node* head;
	Node* tail;

}List;



void Init_list(List* L)
{
	int length;

	printf("please enter list length: ");
	scanf("%d",&length); //scanf里面不能写类似于printf中打印字符串的语句

	int number;
	Node* first = (Node*)malloc(sizeof(Node));
	if(!first)
		printf("wrong!\n");

	scanf("%d",&number);    //在这里改一下就没有头节点了	
	first -> data = number;
	first -> next = NULL;
	L->head = L->tail = first;

	for(int i = 1; i< length; i++)
	{
		Node* new = (Node*)malloc(sizeof(Node));
		scanf("%d",&new -> data); //这个语句注意一下

		new -> next = NULL;
		L->tail -> next = new;
		L->tail = new;

	}


}




void merge(List* l1,List l2)
{
	Node *p, *q,*prev;
	p = l1->head;  q = l2.head;
    //用l1来存储新的链表

	while(p && q)
	{
		if(p->data < q->data)
		{
			prev = p;
			p = p->next;

		}
		else if(p->data > q->data)
		{
			//我这里不破坏原链表用的方法是创建一个新的节点,将要插入的节点复制进去
			Node* save = (Node*)malloc(sizeof(Node));
			save->data = q->data;

			q = q->next;
			prev->next = save;
			save->next = p;
		}
		else
		{
			prev = p;
			p = p -> next;
			q = q-> next;
		}
	} 

	//将最后一个元素归到链表中
	if(p)
		q = p;
	
	while(q != NULL)
	{
		Node* save_tmp = (Node*)malloc(sizeof(Node));
		save_tmp->data = q->data;
		prev -> next = save_tmp;
		save_tmp -> next = NULL;
		prev = prev->next;
		q = q->next;

	}
	

}


void print_list(List L)
{
	Node* p;
	p = L.head;

	while(p != NULL)
	{
		printf("%d ",p->data);
		p = p -> next;
	}

	printf("\n");
}




int main(int argc, char const *argv[])
{
	List l1,l2;

	Init_list(&l1);
	Init_list(&l2);

	//print_list(l1);
	//print_list(l2);


	merge(&l1,l2);

	printf("after merge: ");
	print_list(l1);

	printf("l2: ");
	print_list(l2);


	

	return 0;
}

运行截图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37414405/article/details/89198857