数据结构练习
本文的融合方法引用 https://blog.csdn.net/lishun1422840684/article/details/77984583
typedef
struct node
{
int data;
struct node* next;
}Node;
void Create(Node**);
Node * Merge(Node*,Node*);
void Output(Node*);
int main(void)
{
Node *head1 = NULL;
Node *head2 = NULL;
Create( & head1 );
Create( & head2 );
Output( Merge ( head1 , head2 ) );
return 0;
}
void Create (Node** p_head)//尾插法
{
printf("输入数据输入零即停止\n");
int key;
scanf("%d",&key);
Node * last = NULL;
while( key )
{
Node * p = malloc(sizeof(Node));
p -> data = key;
if(* p_head == NULL)
{
p->next = * p_head;
* p_head = p;
last = p;
}else{
last -> next = p;
p -> next = NULL;
last = p;
}
scanf("%d",& key);
}
}
Node* Merge (Node * head1,Node * head2)//从小到大排序
{
Node * head;
if( ! head1)//特殊情况
{
return head2;
}
if(! head2)
{
return head1;
}
Node *p1 = head1;
Node *p2 = head2;
if(head1 -> data <= head2 -> data)//这一步不可缺少
{
head = p1;
p1 = p1 -> next;
}
else
{
head = p2;
p2 = p2->next;
}
Node * p = head;
while( p1 && p2 )//普通情况
{
if( p1 -> data <= p2 -> data )
{
p -> next = p1;
p1 = p1 -> next;
}
else
{
p -> next= p2;
p2 = p2 -> next;
}
p = p -> next;
}
if( p1 )//尚有剩余没有排序完的情况
{
p -> next= p1;
}
if( p2 )
{
p -> next= p2;
}
return head;
}
void Output(Node * head)
{
Node * p = head;
while( p )
{
printf("%d ",p -> data);
p = p -> next;
}
putchar('\n');
}
总结:这种融合,并不完美,这并没有去重,虽然没有重新再定义一个新的链表,但还是要了一个指针白白占了四个字节的空间。有问题欢迎提问。