#include "stdio.h"
#include "stdlib.h"
struct node
{
int data;
struct node next;
};
struct node *creat(int *a)
{
struct node*h,*p,*q;
int i;
h=p=(struct node)malloc(sizeof(struct node));
for(i=0;i {
q=(struct node*)malloc(sizeof(struct node));
q->data=a[i];
p->next=q;
p=q;
}
p->next=0;
return h;
}
void output(struct node*h)
{
struct node*p;
p=h->next;
if(p==NULL)
printf("The list is NULL!\n");
else
{
printf("\nHead");
while(p->next!=0)
{
printf("->%d",p->data);
p=p->next;
}
printf("->End\n");
}
}
void merge(struct node *p,struct node *q)
{
struct node *s,*r;
r=p;
while(r->next!=NULL)
{
if(r->next->datanext->data)
{
s=r->next;
r=s->next;
s->next=r;
r=s;
r=r->next;
}
else if(r->next->data>q->next->data)
{
s=q->next;
q->next=s->next;
s->next=q;
r->next=s;
r=r->next;
}
else
{
r=r->next;
s=q->next;
q=q->next;
free(s);
}
}
if(q->next!=NULL)
{
r->next=q->next;
free(q);
}
}
void main()
{
struct node *p,*q;
int a[10]={1,2,3,4,5,7,9,11,13,15};
int b[10]={1,2,3,4,5,8,10,12,14,16};
p=creat(a);
printf("The first list before merging:\n");
output(p);
q=creat(b);
printf("The second list before merging:\n");
output(q);
merge(p,q);
printf("The list after merging:\n");
output(p);
}
===C程序题:假设链表p和链表q中的结点值都是整数,且按结点值递增次序链接起来的带表头结点的单链表,在每个链表中,每个结点的值各不相同,但链表p和链表q可能有值相同的结点。下面函数将链表q合并到链表p中,使得合并后的链表仍为按结点值递增有序的单链表,且链表中每个结点的值各不相同。====求教void merge(struct node *p,struct node *q)哪里出错了,导致以上程序运行结果不对呢?
else if(r->next->data>q->next->data)
{
s=q->next;
q->next=s->next;
s->next=q;
r->next=s;
r=r->next;
}
在r=r->next的时候出现错误。
struct node
{
int data;
struct node* next;
};
struct node* create(int* a, int ilength)
{
struct node* h,*p, *q;
int i = 0;
h = p = (struct node*)malloc(sizeof(struct node));
for (int i = 0; i < ilength; i++)
{
q = (struct node*)malloc(sizeof(struct node));
q->data = a[i];
p->next = q;
p = q;
}
p->next = 0;
return h;
}
void output(struct node* h)
{
struct node*p = h->next;
if (p == NULL)
{
return;
}
printf("\nHead");
while (p != NULL)
{
printf("->%d", p->data);
p = p->next;
}
printf("->End\n");
}
void merge(struct node *p, struct node *qM)
{
struct node *s, *r;
r = p->next;
struct node* q = qM->next;
while (r != NULL && q != NULL)
{
if (r->data < q->data)
{
if (r->next != NULL && r->next->data > q->data)
{
s = r->next;
r->next = q;
r = q;
q = q->next;
r->next = s;
}
else
{
r = r->next;
}
}
else if (r->data == q->data)
{
s = q;
q = q->next;
free(s);
}
else if (r->data > q->data)
{
s = q;
q = q->next;
s->next = r;
if (p->next == r)
{
p->next = s;
}
r = s;
}
}
if (q != NULL)
{
r = p;
while (r->next != NULL)
{
r = r->next;
}
r->next = q;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
struct node *p,*q;
int a[10]={1,20,30,40,50,70,90,110,130,150};
int b[10]={1,2,3,4,5,8,10,12,14,16};
p=create(a, 10);
printf("The first list before merging:\n");
output(p);
q=create(b, 10);
printf("The second list before merging:\n");
output(q);
merge(p,q);
printf("The list after merging:\n");
output(p);
return 0;
}
void output(struct node*h)
{
struct node*p;
p=h->next;
if(p==NULL)
printf("The list is NULL!\n");
else
{
printf("\nHead");
while(p!=0)
{
printf("->%d",p->data);
p=p->next;
}
printf("->End\n");
}
}
void merge(struct node *p,struct node *q)
{
struct node *m=p->next,*n=q->next,*s,*t;
while(NULL!=n)
{
if(m->data==n->data)
{
s=n;
if(n==NULL)
return;
n=n->next;
free(s);
}else if(m->data<n->data)
{
s=m;
m=m->next;
if(m==NULL)
{
s->next=n;
s->next->next=NULL;
return;
}
}else
{
if(n->next==NULL)
return;
t=n->next;
n->next=m;
s->next=n;
n=t;
}
}
因为你的next已经空了吧?断点看下,如果是空的next的话就会出错了