#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;
}
数据结构学习记录(4)——链表数据按顺序合并
最新推荐文章于 2023-01-26 11:55:20 发布