有序单链表的合并

来源:互联网 发布:章子怡长相知乎 编辑:程序博客网 时间:2024/06/05 15:02

接上两篇,一个是递归与非递归的区别,这里能明显的看出来,递归代码简洁,易懂,但层层调用会消耗栈空间。另一个这是单链表的一个小应用,具体实例的一个东西……


#include "stdafx.h"

#include <iostream>
#include "stdlib.h"
using namespace std;


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


/*
创建单链表


日期:2017年11月3日 21:46
*/
node * create()
{
int i = 0;
node *head, *p, *q = NULL;
int x = 0;
head = new node();


while (true)
{
printf("shu ru jie dian zhi");
scanf("%d", &x);
if (x == 0)
{
break;
}
p = new node();
p->data = x;
if (++i == 1)
{
head->next = p;
}
else
{
q->next = p;
}
q = p;
}
q->next = NULL;
return head;
}
/*
测单链表长度


日期:2017年11月3日 21:53
*/
int Length(node * head)
{
int len = 0;
node *p;
p = head->next;
while (p != NULL)
{
len++;
p = p->next;
}
return len;


}
/*
单链表打印


日期:2017年11月3日 21:53
*/
int Print(node * head)
{
int index = 0;
node *p;
if (head->next == NULL)
{
printf("link is null\n");
return 0;
}
p = head->next;
while (p != NULL)
{
printf("the %dth node is %d\n", ++index, p->data);
p = p->next;
}
return index;
}




//递归方法 有序单链表合并 
//按升序排序,至于降序一样的道理
node * combineUseDigui(node * headA, node* headB)
{
node *head = NULL;
if (headA == NULL)
{
return headB;
}
else if (headB == NULL)
{
return headA;
}
if (headA->data <  headB->data)
{
head = headA;//谁小,head指向谁
head->next = combineUseDigui(headA->next, headB);//下一个元素
}
else {
head = headB;
head->next = combineUseDigui(headA, headB->next);//下一个元素
}
return head;
}


//非递归方法 有序单链表合并 
//按升序排序,至于降序一样的道理
node *  insert_node(node * head, node*item);
node * combineUseFeiDigui(node * headA, node* headB)
{
node *  head=NULL;
node *p;
node *nextp;
if (headA == NULL)
{
return headB;
}
else if (headB == NULL)
{
return headA;
}


if (Length(headA)>Length(headB))
{
head = headA;
p = headB;
}
else
{
head = headB;
p = headA;
}


while (p!=NULL)
{
nextp = p->next;
head = insert_node(head, p);
p = nextp;
}
return head;
}


node *  insert_node(node * head, node*item)
{
node*p = head;
node*q = NULL;
while (p->data < item->data&&p!=NULL)
{
q = p;
p = p->next;
}
//插入到头节点之前
if (p == head)
{
item->next = p;
return item;
}
//插入到q与p之间
q->next = item;
item->next = p;
return head;
}


int main()
{
node * head1 = create();
head1 = head1->next;
node * head2 = create();
//node *head = combineUseDigui(head1, head2);
//Print(head);
node *head3 = combineUseFeiDigui(head1, head2);
printf("\n\n\n");
Print(head3);
system("pause");

    return 0;
}