#define MaxSize 100
/*定义顺序表*/
typedef struct
{
int list[MaxSize];
int size;
}SeqList;
/*初始化*/
void ListInitiate(SeqList *L)
{
L->size=0;
}
/*求元素个数*/
int ListLength(SeqList L)
{
return L.size;
}
/*插入数据*/
int ListInsert(SeqList *L,int i,int x)
{
int j;
if(L->size>=MaxSize)
{
printf("已满,无法插入!\n");
return 0;
}
else if(i<0 || i>L->size)
{
printf("i值不合法!\n");
return 0;
}
else
{
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
L->list[j]=x;
L->size++;
return 1;
}
......
/*主函数 */
main()
{
SeqList mylist;
int i=0,x=0,length=0;
int choice,position;
ListInitiate(&mylist);
for(;;)
{
i=0,x=0;
printf("\t\t*******************主菜单******************\n");
printf("\t\t* 1.输入结点 *\n");
printf("\t\t* 2.结点个数 *\n");
printf("\t\t* 3.插入结点 *\n");
printf("\t\t* 4.输出结点 *\n");
printf("\t\t* 5.删除结点 *\n");
printf("\t\t* 6.退出系统 *\n");
printf("\t\t************http://www.roufo.com***********\n");
printf("\t\t请输入你的选择项:");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("\t\t请输入数据(数字):");
for(i=0;i<5;i++) //修改此处(5)即可改变默认输入数字个数
{
scanf("%d",&x);
ListInsert(&mylist,i,x);
}
break;
.
.
.
case 6:exit(1);break;
default: printf("\t\t输入错误!\n");
}
}
}
早上一直上课,现在重新看数据结构了,还是顺序表,上述还是顺序表建立,删除,插入的示例程序,我有些疑问的是,在初始化顺序表时,L->size=0.那么按照程序要求,选择1输入节点时,譬如我随便输入几个数,这时执行主函数里的for循环,调用ListInsert(&mylist,i,x)这个函数,i值被作为实参进行传递,但是函数ListInsert中有for(j=L->size;j>i;j--)这个条件,那么j的初值也为0,j>i的条件就不成立啊,或者说任何时候j和i的值都是一样的(因为之前L->size=0),按照道理数据应该无法插入啊。。。
为什么还能运行呢?我之前的分析错误在哪里?
5 个解决方案
#1
请大家看看啊,我是初学者,问题比较傻,请包涵
#2
ListInsert函数里
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&mylist,0,1)
for循环不满足条件,不执行.
继续执行后面的语句:
L->list[j]=x;
L->size++;
这样就成功插入了第一个元素.
后面的依次类推.
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&mylist,0,1)
for循环不满足条件,不执行.
继续执行后面的语句:
L->list[j]=x;
L->size++;
这样就成功插入了第一个元素.
后面的依次类推.
#3
明白了,我还是没看仔细,程序原来会特意跳过for循环,但是执行L->list[j]=x;
这时list[j]代表什么呢?因为j没赋给初值啊(还是说j已经被赋予初值L->size=0了?)
#4
for(j=L->size;j>i;j--)
for语句的执行过程,先执行j=L->size, 然后判断j>i;此时j=0, 0>0条件不成,所以循环体部分不执行了.
for循环的第一个表达式是初始化语句,会执行的.
#5
OK,明白了,现在想想,经常会被一些小问题所困扰半天,有些问题自己也猜测会不会如此但是又不敢确定,你们能在我身边该多好啊。。。
#1
请大家看看啊,我是初学者,问题比较傻,请包涵
#2
ListInsert函数里
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&mylist,0,1)
for循环不满足条件,不执行.
继续执行后面的语句:
L->list[j]=x;
L->size++;
这样就成功插入了第一个元素.
后面的依次类推.
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&mylist,0,1)
for循环不满足条件,不执行.
继续执行后面的语句:
L->list[j]=x;
L->size++;
这样就成功插入了第一个元素.
后面的依次类推.
#3
明白了,我还是没看仔细,程序原来会特意跳过for循环,但是执行L->list[j]=x;
这时list[j]代表什么呢?因为j没赋给初值啊(还是说j已经被赋予初值L->size=0了?)
#4
for(j=L->size;j>i;j--)
for语句的执行过程,先执行j=L->size, 然后判断j>i;此时j=0, 0>0条件不成,所以循环体部分不执行了.
for循环的第一个表达式是初始化语句,会执行的.
#5
OK,明白了,现在想想,经常会被一些小问题所困扰半天,有些问题自己也猜测会不会如此但是又不敢确定,你们能在我身边该多好啊。。。