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高手看看
有加分~ 展开
使链表中各结点数据域小于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高手看看
有加分~ 展开
2个回答
展开全部
有几个地地方出问题了,一个是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);
}
你自己看吧!具体代码如下:
#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);
}
展开全部
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;
}
{
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询