数据结构学习记录(4)——链表数据按顺序合并

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define SIZE 25000
//构建链表结构体
typedef struct node{
	int number;
	node* next;
}no; 
//创建链表(头插法)**更合适用尾插法,因为题目是按顺序输出的** 
/*no* creat1(int num[],int len){
	no *fresh,*head;//fresh为要新添加的结点,head为头结点 
	head = (no*)malloc(sizeof(no));
	//fresh = (no*)malloc(sizeof(no));
	head->next=NULL;
	//fresh->next=NULL;
	int i=0;
	for(i=0; i<len; i++){
		fresh = (no*)malloc(sizeof(no));
		fresh->number=num[i];//赋值 
		fresh->next=head->next;//fresh的下一结点指向head的下一个结点 
		head->next=fresh; //head的下一个结点指向新结点fresh 
	}
	return head;
} 
no* creat2(int num[],int len){
	no *fresh,*head;//fresh为要新添加的结点,head为头结点 
	head = (no*)malloc(sizeof(no));
	//fresh = (no*)malloc(sizeof(no));
	head->next=NULL;
	//fresh->next=NULL;
	int i=0;
	for(i=0; i<len; i++){
		fresh = (no*)malloc(sizeof(no));
		fresh->number=num[i];//赋值 
		fresh->next=head->next;//fresh的下一结点指向head的下一个结点 
		head->next=fresh; //head的下一个结点指向新结点fresh 
	}
	return head;
}*/
no* creat1(int num[],int len){
	no *p,*pre,*head;//p每次存放需要新加入的结点,pre作为前置结点,head作为头结点 
	head = (no*)malloc(sizeof(no));//创建头节点的存储空间
	head->next = NULL;//头结点不存储数据
	pre=head;//记录pre为head
	int i;
	for (i=0; i<len; i++){
		p = (no*)malloc(sizeof(no));//创建新结点,可赋值,**疑问如何释放内存** 
		p->number = num[i];
		p->next = NULL;//指针域设为NULL作为最后的新结点添加到原结点上(尾插法)
		pre->next = p;//向尾部添加结点
		pre = p;//pre作为前置结点 
		 
	}
	return head;//返回头结点 
}
no* creat2(int num[],int len){
	no *p,*pre,*head;//p每次存放需要新加入的结点,pre作为前置结点,head作为头结点 
	head = (no*)malloc(sizeof(no));//创建头节点的存储空间
	head->next = NULL;//头结点不存储数据
	pre=head;//记录pre为head
	int i;
	for (i=0; i<len; i++){
		p = (no*)malloc(sizeof(no));//创建新结点,可赋值,**疑问如何释放内存** 
		p->number = num[i];
		p->next = NULL;//指针域设为NULL作为最后的新结点添加到原结点上(尾插法)
		pre->next = p;//向尾部添加结点
		pre = p;//pre作为前置结点 
		 
	}
	return head;//返回头结点 
}
//创建添加元素,创建一个新链表,使两组数一次在新列表中添加且只填一次
//归并法 
no* add(no *l1, no *l2){ 
	no* p = l1->next;
	no* q = l2->next;
	no* c; 
	no* head = (no*)malloc(sizeof(no));
	head = c = l1;
	while(p!=NULL&&q!=NULL){
		if(p->number<q->number){
			c->next = p;
			c = p;
			p=p->next;
		}
		//保证每个数只填一次 两组数应该同时移动 
		else if(p->number==q->number){
			c->next = p;
			c = p;
			p=p->next;
			q=q->next;
		} 
		else{
			c->next=q;
			c=q;
			q=q->next;
		}
	}
	c->next=p?p:q;//剩余的数赋值 
	return head; 
	
} 
//主函数
int main () {
	int i=0,j=0;
	int X,Y;
	int* num1=(int*)malloc(SIZE*sizeof(int));
	int* num2=(int*)malloc(SIZE*sizeof(int));
	while(scanf("%d",&X)) {
		if(X==0) break;
		else {
			num1[i]=X;
			i++;
		}
	}
	while(scanf("%d",&Y)) {
		if(Y==0) break;
		else {
			num2[j]=Y;
			j++;
		}
	}
	no* L1=creat1(num1,i);
	no* L2=creat2(num2,j);
	no* L3=add(L1,L2);
	L3=L3->next;
	L2=L2->next;
	L1=L1->next;
	/*while(L1!=NULL){
		printf("%d ",L1->number);
		L1=L1->next;
	}
	printf("\n");
	while(L2!=NULL){
		printf("%d ",L2->number);
		L2=L2->next;
	}*/
	while(L3!=NULL){
		printf("%d ",L3->number);
		L3=L3->next;
	}
   return 0;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值