首页 新闻 赞助 找找看

【问题】用C++结构体实现顺序表,数据超过数组长度后,表长自动+1

0
悬赏园豆:10 [已解决问题] 解决于 2018-08-20 11:11
 1 #include <stdio.h>
 2 #include "stdlib.h"
 3 
 4 #define LIST_INIT_SIZE 100
 5 #define LISTINCREMENT 10
 6 
 7 typedef int ElemType;
 8 
 9 typedef struct
10 {
11     ElemType elem[LIST_INIT_SIZE];
12     int length;
13     int listsize;
14 }SqList;
15 
16 class Sq
17 {
18     public:
19         SqList sqList;
20 
21         Sq();
22         ElemType getElem(int i);
23         bool listInsert(int i, ElemType e);
24         bool listDelete(int i, ElemType &e);
25 };
26 
27 Sq::Sq()
28 {
29     this->sqList.length = 0;
30     this->sqList.listsize = LIST_INIT_SIZE;
31 }
32 
33 ElemType Sq::getElem(int i)
34 {
35     if (i<1 || i>sqList.length) return ElemType();
36 
37     ElemType elem = sqList.elem[i - 1];
38 
39     return elem;
40 }
41 
42 bool Sq::listInsert(int i, ElemType e)
43 {
44     if (i<1 || i>sqList.length + 1) return false;
45 
46     for (int j = sqList.length - 1; j >= i; j++)
47     {
48         sqList.elem[j + 1] = sqList.elem[j];
49     }
50 
51     if(i==101)
52     {
53         printf("%d\n",sqList.length);//100
54     }
55     sqList.elem[i - 1] = e;
56     if(i==101)
57     {
58         printf("%d\n",sqList.length);//101
59     }
60     ++sqList.length;
61     if(i==101)
62     {
63         printf("%d\n",sqList.length);//102
64     }
65     return true;
66 }
67 
68 int main()
69 {
70     Sq sq;
71     for (int i = 1; i <= 102; i++)
72     {
73         sq.listInsert(i, i);
74     }
75     
76     return 0;
77 }
View Code
当i==10时,sq.listInsert(int,int)方法中,插入之后length自动+1???执行自动操作后又自动+1。
C++
问题补充:
 1 //修改main方法
 2 int main()
 3 {
 4     Sq sq;
 5     for (int i = 1; i <= 102; i++)
 6     {
 7         int e = 0;
 8         e = i;
 9         if (i == 101)
10         {
11             printf("%d", sq.sqList.length);
12             e = 200;
13         }
14         sq.listInsert(i, e);//55行执行后,sqList.length会变成200。
15     }
16     
17     return 0;
18 }
junlu的主页 junlu | 菜鸟二级 | 园豆:204
提问于:2018-08-17 17:49

你问题是什么?

Shendu.cc 5年前

@Shendu.cc: 53行和58行打印出来的值应该相同,即都是100。sqList.length没有自增操作,58行却打印出101,不符合正常的逻辑。

junlu 5年前
< >
分享
最佳答案
0

当数据超出数组长度,会把超出的值覆盖结构体里其他变量的值,当其它变量也都占据之后,再继续添加就出抛溢出错误。代码见评论。

junlu | 菜鸟二级 |园豆:204 | 2018-08-20 11:07

为啥必须悬赏才能关闭问题😥

junlu | 园豆:204 (菜鸟二级) | 2018-08-20 11:13

原来是这样,结构体中的数组原来是这样。

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-08-20 12:44
#include <stdio.h>

typedef struct
{
    int elem[2];
}SqList;

int main()
{
   /* 我的第一个 C 程序 */
   printf("Hello, World! \n");
   SqList sl;
    printf("%d\n",sizeof(sl));
    for(int i=0;i<6;i++)
    {
        sl.elem[i]=i;
        printf("%d ",sizeof(i));
        printf("%d\n",sl.elem[i]);
    }
   return 0;
}

/*
Hello, World! 
8
4 0
4 1
4 2
4 3
4 4
4 5
*/

这就有点过分了。。。

使用https://c.runoob.com/compile/12可以正常打印结果没有error,使用vs程序执行结束会报错。

junlu | 园豆:204 (菜鸟二级) | 2018-08-20 15:43
其他回答(1)
0

有意思,你把数组长度增大,增到1000。你定义的是100,可是你for循环到了101 ,应该会报溢出的错误,可是却出现了乱七八糟的结果。

收获园豆:10
Shendu.CC | 园豆:2138 (老鸟四级) | 2018-08-17 18:16

嗯嗯,因为它之前没溢出,后来研究为啥没溢出的时候,后来就又碰到这个诡异的问题了。

支持(0) 反对(0) junlu | 园豆:204 (菜鸟二级) | 2018-08-17 21:00
 1 //修改代码如下:
 2 bool Sq::listInsert(int i, ElemType e)
 3 {
 4     if (i<1 || i>sqList.length + 1) return false;
 5 
 6     for (int j = sqList.length - 1; j >= i; j++)
 7     {
 8         sqList.elem[j + 1] = sqList.elem[j];
 9     }
10 
11     if(i==101||i==102)
12     {
13         printf("length:%d\n",sqList.length);
14         printf("size:%d\n",sqList.listsize);
15     }
16     sqList.elem[i - 1] = e;
17     if(i==101||i==102)
18     {
19         printf("length:%d\n",sqList.length);
20         printf("size:%d\n",sqList.listsize);
21     }
22     
23     ++sqList.length;
24     if(i==101||i==102)
25     {
26         printf("length:%d\n",sqList.length);
27         printf("size:%d\n",sqList.listsize);
28     }
29     return true;
30 }
31 
32 int main()
33 {
34      Sq sq;
35      for (int i = 1; i <= 102; i++)
36      {
37          int e = 0;
38          e = i;
39          if (i == 101||i==102)
40          {
41             printf("%d\n",i);
42              e=101;
43          }
44          sq.listInsert(i, e);
45      }
46      
47      return 0;
48 }
49 //打印结果:
50 /*
51 101
52 length:100
53 size:100
54 length:101
55 size:100
56 length:102
57 size:100
58 102
59 length:102
60 size:100
61 length:102
62 size:101
63 length:103
64 size:101
65 */
66 /*结论:当数据超出数组长度,会把超出的值覆盖结构体里其他变量的值,当其它变量也都占据之后,再继续添加就出抛溢出错误了。*/
支持(0) 反对(0) junlu | 园豆:204 (菜鸟二级) | 2018-08-20 11:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册