数据结构(C语言) 请大家帮帮忙

1.有一算法typedefstructLNode{intdata;strcutLNode*next;}*LinkList;intfun(Linklist&p,intx){... 1.有一算法
typedef struct LNode
{ int data;
strcut LNode *next;
}*LinkList;
int fun(Linklist &p, intx)
{ int flag=1;
Linklist q,r,s;
s=(LinkList)malloc(sizeof(Lnode));
s->data=x;
s->next=NULL;
r=p;
if(!p)
{p=s;
flag=-1;
}//if
//S1;
while(r&&flag==1)
{ q=r;
if(r->data==x)
{r->data*=x;
flag=0;
}
r=r->next;
}//while
//S2:
if(flag==1)
{ q->next=s;
}//if
return flag;
}
当函数返回值为-1,1时,分别表示什么含义?S1与S2之间的程序段是什么功能?(另外麻烦解释下//S1 //S2 //if//while 什么意思 我认为既然//表示解释语句,应该对程序不起作用,但是程序很明显起作用了)
2.设a[1....2n]中存储某自然数序列,试设计算法 (只写算法)
(1)SortOdd(int *p,int m)
//把a[1],a[3],...a[2n-1]按升序排序,P指向a[1]
(2)SortEven(int *p int m)
//把a[2],a[4],...a[2n]按降序排列,P指向a[1]
(3)int GetPair(int *p,int m)
//获得相等对总数,并返回,P指向a[1]
//例如假设a[1]=5 a[2]=5 a[3]=1 a[4]=0 则a[1]与a[2]是一个相等对,a[3],a[4]不是相等对 (排序我倒是会,但是我不知道如何用指针排序,麻烦大大帮忙)
展开
 我来答
cloudy_n
2008-03-19 · TA获得超过171个赞
知道小有建树答主
回答量:264
采纳率:0%
帮助的人:0
展开全部
我们从两种情况看一下,
第一种,第一个参数不为空.
那么第一个IF语句不会被执行.flag等于1,因为r=p;r自然也有值.while会被执行.然后查找p指向链里是否有哪个值等于x,如果有,将该节点的值乘x,flag被赋0,这就是while的功能.有相等的话,也就是s1到s2之间的功能.然后看一下后一个if语句,flag是否为1,只有在这个链里没有和X相等的值且链不为空的情况才会为1,这也是返回1时的情况,如果为1那么把构造的那个节点放到链最后.返回的自然是1.还有一种情况,链里有和X相同的值,是要返回0的.
第二种,第一个参数为空.
那么,第一个IF会被执行,将构造的S赋给p带回.这样,因为r=p在此之前,r不会有值,while不会被执行,后一个if因为flag等于-1自然也不会执行.那么返回-1.

那些://S1 //S2 //if//while 是注释,你要坚信这一点,它的作用只是标识功能从这里开始和语句在这个括号这里结束.

下面那道题:
第一种,你既然对排序有了解了,那你排序时如果在循环的时候每一次循环都自增2,其不是和你平常排序一样.第二个问题相同.这样的问题还是自己想想做做吧,如果遇到那里调试不过,出错,再来问一下.
第三个问题:其实这里还有一个不明白,如果有三个相同的话,我们是当它有几对.这在判断的时候也是可以做为条件的,如果当两的话,你可以顺序从前往后比较了,如果当一对的话,你要在你比较后做个标记了.还是那句话,自己想想做做,碰到调不通了,有问题了,再来问,只解决你不明白的地方,对你积累很重要.
匿名用户
2008-03-19
展开全部
返回值为-1,说明linklist为空,同时把函数的参数x插入linklist
返回值为0,说明linklist中有内容为x的元素
返回值为1,说明linklist不为空,但是没有内容为x的元素,同时把函数的参数x插入linklist

r->data*=x 的意思是 r->data = r->data*x

S1就是做了一个判断linklist是否为空,如果为空把x插入到linklist里面的工作
S2就是遍历linklist的所有内容,查找是否有内容为x的元素,如果有把data里面存放的数乘以x,然后再放回到data里面。
最后的if就是对S2做最后的补充,因为在执行S2的时候,把原来的数据换成原来的数据乘以x了,所以就再添加进去。

我觉得编写这个程序的人,有点绕路了,既然后来填进去,当初何必改呢。。。。。。

4.用冒泡排序的算法,虽然算法的复杂度高(指的是算法效率不高),但是算法简单易懂,基本上所有的新手书上都有。
(1)让初始值为1,步长为2,做一次冒泡排序就行了
(2)让初始值为2,步长为2,做一次冒泡排序就行了
(3)count = 0;
for (i = 0; i< lengthof(a); i++) {
for (j = 0; j< lengthof(a); j+ {
if (a[i]==a[j]) count++;
};
};
这是一段伪代码,可以作为参考
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhao6014
2008-03-19 · 超过12用户采纳过TA的回答
知道答主
回答量:96
采纳率:0%
帮助的人:52.6万
展开全部
1.返回-1表示传入的链表是空的,则用x产生一个标结作为链表头节点
返回1表示链表p中没有值等于x的节点,则将用x产生的节点插入链表尾部
返回0表示p中有含x的节点,则将改节点的值乘以x

while(r&&flag==1) //如果节点 是空或者flag不是1则退出循环
{ q=r;
if(r->data==x) //节点的数据是不是x,是则乘以x,flag置1,退出循环
{r->data*=x;
flag=0;
}
r=r->next; //指向链表的下一个节点
}//while

//是注释,只有//后面的不起作用
2.网上很多
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
圆球球UOB
推荐于2016-01-14 · TA获得超过648个赞
知道小有建树答主
回答量:317
采纳率:0%
帮助的人:0
展开全部
#include <stdio.h>
#include <stdlib.h>
#define N 7
void initArray(int *p)
{
int i;
for(i=0;i<2*N+1;i++) {
*(p+i) = 100-i;//Just some initial values, can be any value
}//for

}//initArray

void printArray(int *p)
{
int i;
for(i=0;i<2*N+1;i++) {
printf("%d ",*(p+i));
}//for
printf("\n");
}//printArray

void sortOdd(int *p, int m) //I'm not quit sure why you need m as a parameter.
{
int i,j,temp;
for(i=1;i<2*N+1;i=i+2) {
for (j = 1; j<2*N+1; j=j+2) {
if (*(p+i)<*(p+j)) {
temp = *(p+i);
*(p+i) = *(p+j);
*(p+j) = temp;
};//if
}//for
}//for

};//sortOdd

int main(int argc, char **argv)
{
int a[2*N+1];
initArray(a);
printArray(a);
sortOdd(a,0);
printArray(a);
return 0;
};//main

你要的第四题的第一小题
在gcc下编译,正常运行,如果你用windows,有问题再消息我吧
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式