您的位置:首页 > 理论基础 > 数据结构算法

数据结构整理_有序链表合并

2015-05-19 11:44 225 查看
线性表的应用类吧,是两个链表的合并,前提是两个表都已经按序排好。通过VC++6.0整理!

// 整理_有序链表合并.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node
{
ElementType data;
struct Node *node;
}Node;

void InitList(Node **head);
void InitListAtTail(Node **head, ElementType data[], int n);
void Merge(Node *la, Node *lb, Node **lc);
void Destroy(Node *head);

int main(int argc, char* argv[])
{
Node *la = NULL, *lb = NULL, *lc = NULL;
ElementType a[] = {1,6,7,9,16,30,39};
ElementType b[] = {2,7,8,9,36,78,99,133,1255};

InitListAtTail(&la, a, sizeof(a)/sizeof(a[0]));
InitListAtTail(&lb, b, sizeof(b)/sizeof(b[0]));
Merge(la, lb, &lc);

Destroy(lc);

return 0;
}

//初始化链表,会创建一个无用节点,即head所指向的节点
void InitList(Node **head)
{
*head = (Node *)malloc(sizeof(Node));
(*head)->node = NULL;
}

//尾部插入创建
void InitListAtTail(Node **head, ElementType data[], int n)
{
Node *p = NULL, *q = NULL;
int i = 0;

InitList(head);

q = *head;
for(i=0; i<n; i++)
{
p = (Node *)malloc(sizeof(Node));
p->data = data[i];
p->node = NULL;
q->node = p;
q = p;
}
}

//合并a链表和b链表,需要表a和表b之前按升序排好
void Merge(Node *la, Node *lb, Node **lc)
{
Node *p = la->node, *q = lb->node, *r = la;

*lc = la;
while(p && q)
{
if(p->data <= q->data)
{
r->node = p;
p = p->node;
r = r->node;
}
else
{
r->node = q;
q = q->node;
r = r->node;
}

}
if(p)
{
r->node = p;
}
if(q)
{
r->node = q;
}
free(lb);
}

//销毁链表,释放内存
void Destroy(Node *head)
{
Node *p = head, *q = NULL;

while(p)
{
q = p->node;
free(p);
p = q;
}
}
测试通过VC++6.0设置断点查看结果得出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: