1、关于数据结构的一道题

1、 合并两个链表
问题描述:设A与B分别为两个带有头结点的有序循环链表(所谓有序是指链接点按数据域值大小链接,本题不妨设按数据域值从小到大排列),list1和list2分别为指向两个链表的头指针。请写出将这两个链表合并为一个带头结点的有序循环链表的算法。

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

typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*link;
void main()
{
int m,n;
link p1,p2,list;
Lnode *initlnode(int n);
Lnode *mergelist(link p1,link p2);
void printf(link list);
scanf("%d %d",&m,&n);
p1=initlnode(m);
p2=initlnode(n);
list=mergelist(p1,p2);
printf(list);
}
link initlnode(int y)
{
link list,a,b;
int i;
a=list=(link)malloc(sizeof(Lnode));
a->next=NULL;
for(i=0;i<y;i++)
{
b=(link)malloc(sizeof(Lnode));
scanf("%d",b->data);
b->next=NULL;
a->next=b;
a=b;
}
b->next=list;
return(list);
}
link mergelist(link p1,link p2)
{
link list,pa,pb,pc;
pa=p1->next;pb=p2->next;
pc=p1=list;
while(pa!=list&&pb!=list)
{
if(pa->data<=pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{pc->next=pb;
pc=pb;
pb=pb->next;}
}
if(pa==list)
{
pc->next=pb;
while(pc->next!=p2)
{
pc=pc->next;
}
pc->next=list;
}
else
{
pc->next=pa;
while(pc->next!=list)
{
pc=pc->next;
}
pc->next=list;

}
return(list);
}
void printf(link list)
{
link q;
q=list;
while(q->next!=list)
printf("%d",q->data);
q=q->next;
}
求高手释疑,请问哪里错了?

算了,贴这儿吧。
#include<stdio.h>
#include<stdlib.h>

typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*link;
void main()
{
int m,n;
link p1,p2,list;
Lnode *initlnode(int n);
Lnode *mergelist(link p1,link p2);
void printf(link list);

scanf("%d %d",&m,&n);
p1=initlnode(m);
p2=initlnode(n);
list=mergelist(p1,p2);
printf(list);
}
link initlnode(int y)
{
link head=NULL;
while (y--)
{
link temp = (link)malloc(sizeof(Lnode));
scanf("%d",&temp->data);
if (head && head->data<temp->data)
{
link before = head;
while (before->next!=head&&temp->data>before->data)
before = before->next;
temp->next = before->next;
before->next = temp;
}
else
{
temp->next = head?head:temp;
head = temp;
}
}
return head;
}
link mergelist(link p1,link p2)
{
link head = NULL;
link builder = head;
link p1Loader = p1, p2Loader = p2;
bool p1Round=false,p2Round=false;
while (1)
{
int v1,v2,v=-1;
if (p1Loader==p1 && p1Round)
break;
if (p2Loader==p2 && p2Round)
break;
v1 = p1Loader->data;
v2 = p2Loader->data;
if (v1<v2)
{
v = v1;
p1Loader = p1Loader->next;
p1Round = true;
}
else
{
v = v2;
p2Loader = p2Loader->next;
p2Round = true;
}

link temp = (link)malloc(sizeof(Lnode));
temp->data = v;
temp->next = NULL;

if (head)
{
builder->next = temp;
builder = temp;
}
else
{
builder = temp;
head = temp;
}
}
if (p1Round && p1Loader==p1)
{
int v;
while (1)
{
if (p2Loader==p2)
if (!p2Round)
p2Round = true;
else
break;
v = p2Loader->data;
p2Loader = p2Loader->next;
link temp = (link)malloc(sizeof(Lnode));
temp->data = v;
temp->next = NULL;

if (head)
{
builder->next = temp;
builder = temp;
}
else
{
builder = temp;
head = temp;
}
}
}
if (p2Round && p2Loader==p2)
{
int v;
while (1)
{
if (p1Loader==p1)
if (!p1Round)
p1Round = true;
else
break;
v = p1Loader->data;
p1Loader = p1Loader->next;

link temp = (link)malloc(sizeof(Lnode));
temp->data = v;
temp->next = NULL;

if (head)
{
builder->next = temp;
builder = temp;
}
else
{
builder = temp;
head = temp;
}
}
}
builder->next = head;
return head;
}
void printf(link list)
{
link q;
q=list;
while(q->next!=list)
{
printf("%d\t",q->data);
q=q->next;
}
printf("%d\t",q->data);

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-10-02
你的代码,太啰嗦了,实在没有耐心看完!

typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*link;
--》
typedef struct lnode{
int data;
struct lnode *next;
}Lnode,*link;

其他没仔细看!

关于数据结构的题
( C )12. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为 A.i B.n-i C.n-i+1 D.不确定 四、简答题 1. 试比较顺序存储结构和链式存储结构的优缺点。分别在什么情况下用二者更适合?顺序存储结构的主要优点是:节省...

关于数据结构的一道题,请问以下题目中B和D选项有什么不同吗?我怎么觉得...
这个很简单,画个图看看就简单,数据结构对于是比较抽象的,需要画图加以形象。熟练后不用画图都行,因为脑子已经有图像了 看图应该懂了吧

数据结构判断题 帮做下
9. 在深度为5的满二叉树中,叶子结点的个数为【 】一、选择题 1.C 2.D 解析:A.完全二叉树可以用数组存储,树是非线性结构 B.链表且插入和删除运算效率高 C.链表也有双向链表 ,有两个指针域 3.A 4.A.顺序表可随机访问任一元素 5.D 6.这道题你是不是弄错了 全都对啊 7....

数据结构题目求解答!先谢各位了!!
首先说明一下什么是数据的存储结构,它是批数据结构在计算机中的表示(物理结构),主要有四种:顺序存储、链式存储、索引存储和散列存储。顺序存储的特点是:逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,第1题里问“可用存储顺序代表逻辑顺序的数据结构”自然是D顺序存储结构了,因为存储是一个物...

数据结构的一道题:中缀表达式A-(B+C\/D)*E的后缀形式是什么?为什么?_百...
后缀表达式是把运算符号放在操作数后面 ABCD\/+E*- 计算方法是:1.把表达式中的每个操作都加括号,(A-((B+(C\/D))*E))2.把运算符号移到对应括号后面:(A((B(CD)\/)+)E)*)- 3.去掉括号:ABCD\/+E*-

数据结构一道题 根据最小生成树的Mst性质,可以得出 A最长边不包含于任...
“逆邻接表”只是把“邻接表”中弧头和弧尾的次序换了,并不是一种新表,它和“邻接表”的唯一区别就是弧尾的nextarc指针指向弧头而已。所以节点数是相等的。(参考数据结构教材164页)第二个问题:我的答案:正确理由:尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点...

一道数据结构的编程题目,希望大大们给小弟解答下,谢谢哈
一道数据结构的编程题目,希望大大们给小弟解答下,谢谢哈 1.设计一个C程序实现一个N*M的矩阵的转置,原矩阵及其转置矩阵保存在二维数组中2.使用全局变量count。改写矩阵转置程序... 1.设计一个C程序实现一个N*M的矩阵的转置,原矩阵及其转置矩阵保存在二维数组中2.使用全局变量count。改写矩阵转置程序 展开  ...

《算法与数据结构》练习一(答案)
回答:习题一一、选择题1、数据结构是一门研究非数值计算的程序设计问题中的操作对象以及它们之间的(B)和运算的学科。A.结构B.关系C.运算D.算法2、在数据结构中,从逻辑上可以把数据结构分成(C)。A.动态结构和静态结构B.紧凑结构和非紧凑结构C.线性结构和非线性结构D.逻辑结构和存储结构3、线性表的逻...

数据结构试题
5、若用链表存储一棵二叉树时,每个结点除数据域外,还有指向左孩子和右孩子的两个指针。在这种存储结构中,n个结点的二叉树共有 ___个指针域, 其中有___个指针域是存放了地址,有___个指针是空指针。参考答案是:2n n-1 n+1 6、对于一个具有n个顶点和e条边的有向图和无向图,在其对应...

一道数据结构的题目,希望能给出详细解答。
二维数组也就相当于矩阵,行下标的范围是0到8,也就是共有9行,同理,列下标的范围是0到4,也就是共有5列,这就是一个9行5列的矩阵,共9*5=45个元素,其中每个元素由4个字节存储,而 A[0,0]的第一个字节的地址是0,那么存储这个矩阵的最后一个字节的地址自然是45*4=180。那么问题中求...

相似回答
大家正在搜