还是顺序表的执行问题,请教!

时间:2021-03-02 10:27:50
#include<stdio.h>
#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++;
这样就成功插入了第一个元素.
后面的依次类推.

#3


引用 2 楼 huanmie_09 的回复:
ListInsert函数里
for(j=L->size;j>i;j--)
  L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&amp;mylist,0,1)
for循环不满足条件,不执行.
继续执行后面的语句:
L……

明白了,我还是没看仔细,程序原来会特意跳过for循环,但是执行L->list[j]=x;
这时list[j]代表什么呢?因为j没赋给初值啊(还是说j已经被赋予初值L->size=0了?)

#4


引用 3 楼 accounthll 的回复:
引用 2 楼 huanmie_09 的回复:
ListInsert函数里
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&amp;amp;mylist,0,1)
for循……

for(j=L->size;j>i;j--)
 for语句的执行过程,先执行j=L->size, 然后判断j>i;此时j=0, 0>0条件不成,所以循环体部分不执行了.
for循环的第一个表达式是初始化语句,会执行的.

#5


引用 4 楼 huanmie_09 的回复:
引用 3 楼 accounthll 的回复:
引用 2 楼 huanmie_09 的回复:
ListInsert函数里
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&a……

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++;
这样就成功插入了第一个元素.
后面的依次类推.

#3


引用 2 楼 huanmie_09 的回复:
ListInsert函数里
for(j=L->size;j>i;j--)
  L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&amp;mylist,0,1)
for循环不满足条件,不执行.
继续执行后面的语句:
L……

明白了,我还是没看仔细,程序原来会特意跳过for循环,但是执行L->list[j]=x;
这时list[j]代表什么呢?因为j没赋给初值啊(还是说j已经被赋予初值L->size=0了?)

#4


引用 3 楼 accounthll 的回复:
引用 2 楼 huanmie_09 的回复:
ListInsert函数里
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&amp;amp;mylist,0,1)
for循……

for(j=L->size;j>i;j--)
 for语句的执行过程,先执行j=L->size, 然后判断j>i;此时j=0, 0>0条件不成,所以循环体部分不执行了.
for循环的第一个表达式是初始化语句,会执行的.

#5


引用 4 楼 huanmie_09 的回复:
引用 3 楼 accounthll 的回复:
引用 2 楼 huanmie_09 的回复:
ListInsert函数里
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
作用是将原顺序表第i-1个元素之后的节点依次从后往前移动一个位置,用以空出第i号位置插入新的元素.
初始化后L->size=0;
因此第一次调用ListInsert(&a……

OK,明白了,现在想想,经常会被一些小问题所困扰半天,有些问题自己也猜测会不会如此但是又不敢确定,你们能在我身边该多好啊。。。

相关文章