您的位置:首页 > 编程语言 > C语言/C++

将两个数组中的元素有序存入到一个链表中(C语言)

2016-01-18 19:05 706 查看
思路:
1、现将数组元素排序
2、再将数组中的元素分别存入链表中
3、合并两个链表
代码实现:
</pre><pre code_snippet_id="1558992" snippet_file_name="blog_20160118_6_8274283" name="code" class="cpp">
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define N 10

typedef struct LNode
{
int key;
struct LNode*next;
} LNode;

void printList(LNode *head)  /*打印链表元素*/
{
while(head)
{
printf("%5d",head->key);
head = head->next;
}
printf("\n");
}

int partition(int *a, int low, inthigh)   //快排划分元
{
int key =a[low];

while (low< high)
{
while(high > low && a[high] >= key)
--high;

if (low< high)
a[low++] = a[high];

while(high > low && a[low] <= key)
++low;

if (low< high)
a[high--] = a[low];
}
a[low] = key;

return low;
}

void Qsort(int *a, int low, inthigh)  //快排
{
if (low>= high || a == NULL)
return;

int mid =partition(a, low, high);
Qsort(a, low, mid - 1);
Qsort(a, mid + 1, high);
}

LNode *merge(LNode*h1, LNode *h2)  //合并
{
LNode head;
LNode *p = &head;

while (h1&& h2)
{
if(h1->key <= h2->key)
{
p->next = h1;
h1 = h1->next;
}
else
{
p->next = h2;
h2 = h2->next;
}
p = p->next;
}

p->next = h1 ? h1 : h2;

returnhead.next;
}

void destroy(LNode *head)  //销毁链表
{
LNode *p = NULL;
while(head)
{
p = head->next;
free(head);
head = p;
}
}

void printArray(int *a, int len)   //打印数组
{
int i;
for (i = 0;i < len; ++i)
printf("%5d",a[i]);
printf("\n");
}

LNode *buildList(int *a, int len)   //将数组a中的元素存入链表
{
LNode head;
LNode *p = &head;
LNode *q = NULL;
int i = 0;
for (i =0;i < len; ++i)
{
q = (LNode*) malloc(sizeof(LNode));
q->key = a[i];
q->next = NULL;

p->next=q;
p = q;
}

returnhead.next;
}

int main(int argc,char* argv[])
{
int a
,b
;
int i;

srand((unsigned)time(NULL));
for (i = 0;i < N; ++i)
{
a[i] = rand() % 100;
b[i] = rand() % 100;
}

printf("输出随机产生a数组的个数");
printArray(a, N);

printf("输出随机产生b数组的个数");
printArray(b, N);

Qsort(a, 0, 9);
Qsort(b, 0, 9);

printf("输出排好序的a数组的个数");
printArray(a, N);

printf("输出排好序的b数组的个数");
printArray(b, N);

LNode *h1 = buildList(a, N);
printf("输出排好序的a链表\n");
printList(h1);

LNode *h2 = buildList(b, N);
printf("输出排好序的b链表\n");
printList(h2);

LNode *p = merge(h1, h2);

printf("输出排好序的链表\n");
printList(p);

destroy(p);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: