VC作业题求助,急o(>﹏<)o在线等~~

/*编写函数change(node*pa,intx)。node指向一个链表,根据参数x的值,使链表中各结点数据域小于x的结点放在链表的前半部,大于等于x的结点放在链表的后... /*编写函数change(node *pa,int x)。node指向一个链表,根据参数x的值,
使链表中各结点数据域小于x的结点放在链表的前半部,大于等于x的结点放在链表的后半部,
并将x插入这两部分结点之间。
例如,原链表上各结点的数据依次为:3,4,2,1,9,6,5,0,10,6
输入:x=7
经插入新结点后,新链表的各结点数据依次为:3,4,2,1,6,5,0,6,7,9,10
*/
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "time.h"
#define N 10
#define NODE struct node
NODE
{
int val;
NODE *next;
};
void *createlink(void)
{
NODE *p1,*p2,*head=NULL;
int i;
for(i=0;i<N;i++)
{
p1=(NODE *)malloc(sizeof(NODE));
p1->val=rand()%11;
p1->next=NULL;
if(head==NULL)
head=p2=p1;
else
{
p2->next=p1;
p2=p1;
}
}
return(head);
}
void freelink(NODE *p)
{
NODE *p1;
while(p)
{
p1=p->next;
free(p);
p=p1;
}
}
void *change(NODE *p,int x)
{
NODE *h1,*p1,*p3,*h2,*p2,*p4,*n;
while(p)
{
if(p->val<x)
{
p1=(NODE *)malloc(sizeof(NODE));
p1->val=p->val;
if(h1==NULL)
h1=p3=p1;
else
{
p3->next=p1;
p3=p1;
}
}
else
{
p2=(NODE *)malloc(sizeof(NODE));
p2->val=p->val;
if(h2==NULL)
h2=p4=p2;
else
{
p4->next=p2;
p4=p2;
}
}
}
n=(NODE *)malloc(sizeof(NODE));
n->val=x;
p3->next=n;
n->next=h2;
freelink(p);
return(h1);
}
void print(NODE *p,int n)
{
int count;
printf("数据如下:\n");
while(p)
{
printf("%d\t",p->val);
count++;
if(count%(n/2)==0)printf("\n");
p=p->next;
}
}
void main()
{
NODE *h,*p;
int x;
srand(time(NULL));
p=(NODE *)createlink();
print(p,N);
scanf("%d",&x);
h=change(p,x);
print(h,N+1);
freelink(h);
}
用VC++6.0通过断点发现,在 h=change(p,x);
这里传入参数时发生错误,但我检查不出来哪里错了,麻烦各位C高手看看
有加分~
展开
 我来答
wubuxiansheng
2009-06-12
知道答主
回答量:8
采纳率:0%
帮助的人:0
展开全部
有几个地地方出问题了,一个是main函数调用了print函数p的指向变为了空;另一个是change函数里的while循环里p的指向没的改变;
你自己看吧!具体代码如下:
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "time.h"
#define N 10
#define NODE struct node

NODE
{
int val;
NODE *next;
};
//结构体链表

NODE *createlink(void) //返回一个结构体链表,
{
NODE *p1,*p2,*head=NULL;
int i;
for(i=0;i<N;i++)
{
p1=(NODE *)malloc(sizeof(NODE));
p1->val=rand()%11; //产生随机数初始化结构体中成员变量
p1->next=NULL;
if(head==NULL)
head=p2=p1;
else
{
p2->next=p1;
p2=p1;
}
}
return(head);
}

void freelink(NODE *p) //删除结构体链表p
{
NODE *p1;
while(p)
{
p1=p->next;
free(p);
p=p1;
}
}

NODE *change(NODE *p,int n)
{
NODE *h1=NULL,*p1,*p3,*h2=NULL,*p2,*p4,*m;
while(p)
{
if(p->val<n)
{
p1=(NODE *)malloc(sizeof(NODE));
p1->val=p->val;
if(h1==NULL)
h1=p3=p1;
else
{
p3->next=p1;
p3=p1;
}
}
else
{
p2=(NODE *)malloc(sizeof(NODE));
p2->val=p->val;
if(h2==NULL)
h2=p4=p2;
else
{
p4->next=p2;
p4=p2;
}
}
p=p->next;
}
m=(NODE *)malloc(sizeof(NODE));
m->val=n;
p3->next=m;
m->next=h2;
freelink(p);
return(h1);
}

void print(NODE *p,int n)
{
NODE *m=p;
int count=0;
printf("数据如下:\n");
while(p)
{
printf("%d\t",p->val);
count++;
if(count%(n/2)==0)
printf("\n");
//输出5个就换行
p=p->next;
}
p=m;
}

void main()
{
NODE *h,*p,*m;
//变量m是用来保证change()中参数中的同不因为print函数而指向NULL
int x;
srand(time(NULL)); //使产生随机数的种子相同
m=p=createlink();
print(p,N);
printf("请输入一个数:");
scanf("%d",&x);
h=change(m,x);
m=h;
print(h,N+1);
freelink(m);
}
梦想窗外
2009-06-12 · TA获得超过1588个赞
知道大有可为答主
回答量:1180
采纳率:0%
帮助的人:1567万
展开全部
NODE *change(NODE *p,int x)
{
NODE *h1,*p1,*p3,*h2,*p2,*p4,*n;
h1 = p1 = p3 = h2 = p2 = p4 = n = NULL;

while(p)
{
if(p->val<x)
{
p1=(NODE *)malloc(sizeof(NODE));
p1->next = NULL;
p1->val=p->val;
if(h1==NULL)
h1=p3=p1;
else
{
p3->next=p1;
p3=p1;
}
}
else
{
p2=(NODE *)malloc(sizeof(NODE));
p2->val=p->val;
p2->next = NULL;
if(h2==NULL)
h2=p4=p2;
else
{
p4->next=p2;
p4=p2;
}
}

p = p->next;
}
n=(NODE *)malloc(sizeof(NODE));
n->val=x;

if (p3)
p3->next=n;
n->next=h2;
freelink(p);

if (h1)
return(h1);
else
return(n);
}
改成这样更好,无需分配多余的新节点。
NODE *change(NODE *p,int x)
{
NODE *h1,*p1, *h2,*p2, *n;
h1 = h2 = p1 = p2 = n = NULL;

while(p)
{
if(p->val<x)
{
if(h1==NULL)
h1=p1=p;
else
{
p1->next=p;
p1=p;
}
}
else
{
if(h2==NULL)
h2=p2=p;
else
{
p2->next=p;
p2=p;
}
}

p = p->next;
}

if (p2)
p2->next = NULL;
n=(NODE *)malloc(sizeof(NODE));
n->val=x;

if (p1)
p1->next=n;
n->next=h2;

if (h1)
return(h1);
else
return n;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式