c语言问题
有三个子函数locate().insert().creat().其中locate产生一个常数q.insert中要用到这个值。在creat中调用函数locate和inser...
有三个子函数locate(). insert(). creat().其中locate产生一个常数q. insert中要用到这个值。在creat中调用函数locate和insert。但是insert中没有调用locate 这样的话 这个q值还能不能被insert利用。不能的话在insert中怎么调用locate呢?谢谢各位大神。。。
说的有点绕,下面是这三个函数。
int q;
int LocateNode(LinkList L,DataType e)
{
ListNode *p=L->next;
q=0;
while(p && e.expn<p->data.expn)
{
p=p->next;
q++;
}
if (p==NULL ||e.expn!=p->data.expn)
return 0;
else
return 1;
}
LinkList InsertNode(LinkList L,DataType e)
{
ListNode *s,*p;
int i=0;
p=L;
while (p->next &&i<q)
{
p=p->next;
i++;
s=(ListNode *)malloc(sizeof(ListNode));
s->data.coef=e.coef;
s->data.expn=e.expn;
s->next=p->next;
p->next=s;
return L;
}
LinkList CreatPolyn(LinkList La,int n)
{
LinkList Pa;
int i;
DataType e;
Pa=(ListNode *)malloc(sizeof(ListNode));
Pa->next=NULL;
for(i=1;i<=n;i++)
{
scanf("%f,%d",&e.coef,&e.expn);
if(!LocateNode(Pa,e))
Pa=InsertNode(Pa,e);
}
return Pa;
} 展开
说的有点绕,下面是这三个函数。
int q;
int LocateNode(LinkList L,DataType e)
{
ListNode *p=L->next;
q=0;
while(p && e.expn<p->data.expn)
{
p=p->next;
q++;
}
if (p==NULL ||e.expn!=p->data.expn)
return 0;
else
return 1;
}
LinkList InsertNode(LinkList L,DataType e)
{
ListNode *s,*p;
int i=0;
p=L;
while (p->next &&i<q)
{
p=p->next;
i++;
s=(ListNode *)malloc(sizeof(ListNode));
s->data.coef=e.coef;
s->data.expn=e.expn;
s->next=p->next;
p->next=s;
return L;
}
LinkList CreatPolyn(LinkList La,int n)
{
LinkList Pa;
int i;
DataType e;
Pa=(ListNode *)malloc(sizeof(ListNode));
Pa->next=NULL;
for(i=1;i<=n;i++)
{
scanf("%f,%d",&e.coef,&e.expn);
if(!LocateNode(Pa,e))
Pa=InsertNode(Pa,e);
}
return Pa;
} 展开
3个回答
展开全部
大概看了一下,楼主的意思是
通过CreatPolyn创建一个链表,而且貌似元素是根据expn的值有序排列的
创建时首先搜索待插入元素的关键字是否存在,不存在才插入
插入的时候,楼主不想再做一次比较了,因此搞了个q想来保存插入的位置
抛开逻辑不谈,如果这三个函数的实现与q的定义在一个文件中,那么q就是全局变量,可以被本文件的代码所访问,这一点建议楼主学习一下全局变量的相关知识。
关于效率,其实再次搜索一次也无妨,因为while(p && e.expn<p->data.expn)
与while (p->next &&i<q)的执行效率没有很大的差别。而且不在这里使用全局变量,也可以增加各个功能函数间的独立性,易于阅读代码,减少bug的出现。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询