求解 函数中用i和i+1 输出的结果一样。。。望高人解答。。

pclvmm 2011-10-28 07:27:36

#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OVERFLOW -1
#define OK 1
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 10

typedef struct{
int *elem;
int length;
int listsize;
}SqList;

int InitList_Sq(SqList *L){
L->elem=malloc(LIST_INIT_SIZE*sizeof(int));
if(!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}

int ListInsert_Sq(SqList *L,int i,int e){
//在顺序表的第i个位置之前插入新的元素e
//i<1 || i>L.length+1
int *p,*q,*newbase;
if(i<1 || i>L->length+1) return ERROR;
if(L->length>=L->listsize){
newbase = (int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));
if(!newbase) exit(OVERFLOW);
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L->length;
return OK;
}

int ListDelete_Sq(SqList *L,int i,int *e){
//在顺序表L中删除第i个元素,用e返回
//i的合法取值范围1<=i<=L->length
int *p,*q;
if(i<1 || i>L->length) return ERROR;
p=L->elem+i-1;
*e=*p;
q=L->elem+L->length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L->length;
return OK;
}

int LocateElem_Sq(SqList *L,int e){
//在顺序表L中查找与e相同的第一个元素
//若存则返回元素的位序,若不存在,返回ERROR
int i=1,*p;
p=L->elem;
while(e!=*p++ && i++<L->length);
if(i<=L->length)
return i;
else
return ERROR;
}

int GetElem(SqList *L,int i){
//从线性表L中取出第i个元素
//1<=i<=L->length
if(i<1 || i>L->length) return ERROR;
return L->elem[i-1];
}

void Union(SqList *La,SqList *Lb){
//将线性表La中的元素插入到线性表Lb中,
//若此元素Lb中不存在则存入 若存在 则不存入
int i,a;
for(i=1;i<=La->length;i++)
if(!LocateElem_Sq(Lb,a=GetElem(La,i)))
ListInsert_Sq(Lb,Lb->length+1,a);
}


void main()
{
SqList la,lb;
int a,i;

InitList_Sq(&la);
InitList_Sq(&lb);
for(i=1;i<=10;ListInsert_Sq(&la,i++,i)); // 这里 最后的i如果变成i+1 输出的结果一样 求解????
for(i=1;i<=10;ListInsert_Sq(&lb,i++,i+6));
for(i=0;i<la.length;printf("%d ",la.elem[i++]));
printf("\n");
for(i=0;i<lb.length;printf("%d ",lb.elem[i++]));
printf("\n");
Union(&la,&lb);
for(i=0;i<lb.length;printf("%d ",lb.elem[i++]));
printf("\n");
printf("%d %d\n",la.length,lb.length);
}



输出结果
2 3 4 5 6 7 8 10 11
7 8 9 10 11 12 13 14 15 16
7 8 9 10 11 12 13 14 15 16 2 3 4 5 6
10 15

...全文
184 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
l470080245 2011-10-29
  • 打赏
  • 举报
回复
这是在MINGW5下编译的结果.
为i时
1 2 3 4 5 6 7 8 9 10
7 8 9 10 11 12 13 14 15 16
7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6
10 16

为i+1时
2 3 4 5 6 7 8 9 10 11
7 8 9 10 11 12 13 14 15 16
7 8 9 10 11 12 13 14 15 16 2 3 4 5 6
10 15

和VS下的结果不太一样. 应该是跟函数的入栈顺序有关吧, 我也不是很清楚.
以为i时来讲, VS下调用ListInsert_Sq时e的值为2
mingw5下调用ListInsert_Sq时e的值为1
所以结果不一样.
至于LZ所说的i如果变成i+1 输出的结果一样 .我真没见过.

PS : 代码风格差, 而且还使用void main
gcc编译器怎么会让这句 L->elem=malloc(LIST_INIT_SIZE*sizeof(int));通过
我编译时都是提示 void * 无法 int *

pclvmm 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 l470080245 的回复:]

这是在MINGW5下编译的结果.
为i时
1 2 3 4 5 6 7 8 9 10
7 8 9 10 11 12 13 14 15 16
7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6
10 16

为i+1时
2 3 4 5 6 7 8 9 10 11
7 8 9 10 11 12 13 14 15 16
7 8 9 10 11 12 13 1……
[/Quote]


代码风格确实差 呵呵

int *L->elem;

void mian 不好DeBug

i和i+1的输出的值相同 你没见过 我在编译之前也没想到会出现这种结果 。。还是无解。。
无论从左还时从右入栈 都不应该一样的结果
结贴了!!!!!!! 谢谢大家
goldbeef 2011-10-28
  • 打赏
  • 举报
回复
for(i=1;i<=10;ListInsert_Sq(&la,i++,i)); // 这里 最后的i如果变成i+1 输出的结果一样 求解????
for(i=1;i<=10;ListInsert_Sq(&lb,i++,i+6));

函数参数的传递一般是从右向左传递,LZ明白了吧
free2011 2011-10-28
  • 打赏
  • 举报
回复
第一:楼主,你直接把问题简化一些更好些,无非是讨论fun(i,i++,i)的问题。何必把这些程序都贴出来。
第二:c标准中并未规定函数参数压栈时的顺序。vc下压栈一般认为从右至左,但也可通过修改函数调用方式改变。
第三:i++的使用,i先把值赋给一个副本,副本在调用i++的表达式中使用,在:结束时将其值加一。
gcc的没有试过。建议楼主用gcc生成汇编文件看看就知道了。类似于这种代码,还是避免为好,移植性会比较差
哈哈,我也冒充一回。。
AnYidan 2011-10-28
  • 打赏
  • 举报
回复
很烂的编程风格

你知道哪个参数会先传入吗?
pclvmm 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 l470080245 的回复:]

VS2008编译
i时输出结果
2 3 4 5 6 7 8 9 10 11
8 9 10 11 12 13 14 15 16 17
8 9 10 11 12 13 14 15 16 17 2 3 4 5 6 7
10 16

i+1时输出结果
3 4 5 6 7 8 9 10 11 12
8 9 10 11 12 13 14 15 16 17
8 9 10 11 12 13 ……
[/Quote]

我感觉是你给的结果 只是想问一下 为什么GCC 出来的结果i和i+1时一样 调用ListInsert_Sq时参数如何入栈的?
l470080245 2011-10-28
  • 打赏
  • 举报
回复
VS2008编译
i时输出结果
2 3 4 5 6 7 8 9 10 11
8 9 10 11 12 13 14 15 16 17
8 9 10 11 12 13 14 15 16 17 2 3 4 5 6 7
10 16

i+1时输出结果
3 4 5 6 7 8 9 10 11 12
8 9 10 11 12 13 14 15 16 17
8 9 10 11 12 13 14 15 16 17 3 4 5 6 7
10 15
你想要什么样的结果
pclvmm 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cdx900605 的回复:]

你的那个ListInsert_Sq(&la,i++,i) 函数调用的时候返回值是ok 或者error 但是你的定义里却要求返回值是int 对于计算机来说 布尔型只能是一或零 所以你的那个for循环........
[/Quote]

老大 你会错意了 #define ERROR 0 #define OK 1 无论它返回什么 对for应该没有影响

“本人用的环境时linux + gcc 没有别的编译器 不知道用VC或什么编译出来结果一样吗
  • 打赏
  • 举报
回复
你的那个ListInsert_Sq(&la,i++,i) 函数调用的时候返回值是ok 或者error 但是你的定义里却要求返回值是int 对于计算机来说 布尔型只能是一或零 所以你的那个for循环........
ProgrammingRing 2011-10-28
  • 打赏
  • 举报
回复
占位学习。。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧