
for(str in names)
str=eval(str)
for(num in numbers)
num=eval(num)
这2个for语句前str和num的值分别是30和20.但执行了这2个for语句后str和num分别变成了29和19.具体什么原因我不清楚。等我把for(str in names)搞明白了再补充~
PS:问题出在俩个for…in语句上
for(str in names)这句的意思是枚举names数组。str最后返回的是names数组的最后一项的脚标。比如说names数据还30个元素(暨names[0]到names[29])当执行完这个for…in后,str的值为4。
在回到你的代码中。你代码中物拆的names数组的元素个数为30个,当执行玩这个for…in后,str被赋值为29(暨names数组最戚型后一个元素的脚标)。同理Num的值也变成高蚂猜了19。故二者的和为48而不是50。
int listinsert(struct LIST *L,int i,struct STU e)中蠢早i是表示插入L中带帆雀stu[]的位置。你再次都传入的是1,这样你第一次的插入就被第二次的插入给覆盖了。(最后面有我改过后的程序,你运行一下。作个对比。)
q=&(L->stu[i-1])
for(p=&L->stu[L->length-1]p>=q--p)
*(p+1)=*p
*q=e
++L->length
首先,它是将第i个stu[]元素放在stu[i-1]的。q=&(L->stu[i-1])表示的是在stu[]中第i个元素,也就是要插入的位置。p=&L->stu[L->length-1]是当前stu[]中最后一个元素。
for(p=&L->stu[L->length-1]p>=q--p)
*(p+1)=*p
p>=q的作用是判断插入位置是不是在最后一个元素之前。
如果是,就依次将第i到最后一个元素,从最后一个开始逐一往后移动一个位置。最后将元素插入第i个元素的位置i-1处。
如果不是,则直接将元素赋值给stu[i],也就是*q。(这里的i<=length,不然会出现小错误的!)
--p作用就是将stu[lengh-1]到stu[i-1]的元素依次往后移。先是length-1到length,再length-2到length-1,如此到i-1到i(p>=q).这样就把i-1的位置给留下来放待插入的元素了!
明白轿消了!希望对你有帮助。
#include"stdio.h"
#include"string.h"
#define ERROR 0
#define OK 1
struct STU{
char name[20]
char stuno[10]
int age
int score
}stu[50]
struct LIST
{
struct STU stu[50]
int length
}L
void printlist(struct LIST L)
{
int i
printf("namestuno age score\n")
for(i=0i<L.lengthi++)
printf("%s %s\t%d\t%d\n", L.stu[i].name, L.stu[i].stuno,
L.stu[i].age, L.stu[i].score)
printf("\n")
}
int listinsert(struct LIST *L,int i,struct STU e)
{
struct STU *p,*q
if (i<1||i>L->length+1) return ERROR
q=&(L->stu[i-1])
for(p=&L->stu[L->length-1]p>=q--p)
*(p+1)=*p
*q=e
++L->length
return OK
}/*ListInsert Before i */
main()
{
struct STU e
L.length=0
strcpy(e.name,"zmofun")
strcpy(e.stuno,"100001")
e.age=80
e.score=1000
listinsert(&L,1,e)
printlist(L)
printf("List length now is %d.\n\n",L.length)
strcpy(e.name,"bobjin")
strcpy(e.stuno,"100002")
e.age=80
e.score=1000
listinsert(&L,2,e)
printlist(L)
printf("List length now is %d.\n\n",L.length)
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)