JerryLeeSir 发表于 2020-4-15 13:37:42

救救孩子吧,顺序表问题求大神解答!

问题是关于顺序表插入元素的,我在顺序表里插入了一个元素,打印时顺序表里确实插入了
我输入的元素,但是顺序表长度没有增加,我知道我传入子函数的n,在出去子函数后会销毁,
我也想到了用指针,但是不知到怎么改,求大神帮助!





#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100


//在第i个位置插入数字item
void Inserint(int sqlist[],int n,int i,int item);
void Inserint(int sqlist[],int n,int i,int item)
{
   
    int t;
    if(n==MaxSize||i < 1|| i > n+1)
      exit(0);
    for (t = n-1;t >= i-1;t--)
    {
      sqlist=sqlist;
    }
    sqlist=item;
    n=n+1;
   
}

int main()
{
    //创建一个静态顺序表
    int sqlist={1,2,4,5,6,7,8,9};
    int n=8;

    //打印出原来数组和数组长度
    printf("原来数组是:");
    for ( int i = 0; i < n; i++)
    {
      printf("%d",sqlist);
    }
    printf("\n");
    printf("原来数组长度是:%d\n",n);

    //在数组的第三个位置插入数字3
    Inserint(sqlist,n,3,3);

    //打印出插入后的数组和数组长度
    printf("现在数组:");
    for ( int i = 0; i < n; i++)
    {
      printf("%d",sqlist);
    }
    printf("\n");
    printf("现在数组长度:%d\n",n);

    return 0;
}


这是打印结果;
原来数组:12456789
原来数组长度:8
现在数组:12345678
现在数组长度:8








我想要的结果是,现在数组长度:9
可是n没有+1


倒戈卸甲 发表于 2020-4-15 13:53:46

本帖最后由 倒戈卸甲 于 2020-4-15 15:03 编辑

把解决方案放到最新回复里面了

JerryLeeSir 发表于 2020-4-15 14:16:26

倒戈卸甲 发表于 2020-4-15 13:53
插入元素的函数弄错了,也就是你第一个函数。显然要先把数组长度加1,然后从序号i开始,依次往后挪。不然你 ...

可是我数组长度是100啊

倒戈卸甲 发表于 2020-4-15 14:35:01

本帖最后由 倒戈卸甲 于 2020-4-15 15:04 编辑

JerryLeeSir 发表于 2020-4-15 14:16
可是我数组长度是100啊

没毛病,外部的n不改变啥都不好使,你打印的时候始终只能打印8个数。函数不能以传值的方式传n。定义函数的时候,写作int& n,传个引用

耻思lhj 发表于 2020-4-15 14:36:39

因为你的n还是8,在函数里的n+1,是不会影响到原来的n的。

倒戈卸甲 发表于 2020-4-15 14:55:26

函数名变为void Inserint(int sqlist[],int& n,int i,int item);其它代码不动,n的修改就能影响外部了。
如果引用你还没学。那就int* p=&n,函数改为void Inserint(int sqlist[],int* n,int i,int item),函数体内*n +=1,也行。

JerryLeeSir 发表于 2020-4-15 15:53:07

倒戈卸甲 发表于 2020-4-15 14:55
函数名变为void Inserint(int sqlist[],int& n,int i,int item);其它代码不动,n的修改就能影响外部了。
...

C语言里没有引用,C++才行,C用int &n的话会报错,第二种方法我过不了编译,求大神再指导一下{:5_109:}

倒戈卸甲 发表于 2020-4-15 15:54:48

JerryLeeSir 发表于 2020-4-15 15:53
C语言里没有引用,C++才行,C用int &n的话会报错,第二种方法我过不了编译,求大神再指导一下

忘了你这是纯C的程序了,你等我开个电脑

耻思lhj 发表于 2020-4-15 15:58:27

本帖最后由 耻思lhj 于 2020-4-15 16:16 编辑

JerryLeeSir 发表于 2020-4-15 15:53
C语言里没有引用,C++才行,C用int &n的话会报错,第二种方法我过不了编译,求大神再指导一下

指针不会你就把n的值return回来。。。
人家说的很详细了。
1,main里加一句 int* p=&n在上面,(或者传参数的时候直接传 &n)
2,函数参数改一下,void Inserint(int sqlist[],int* n,int i,int item)
3,把Inserint()函数里所有n,改成*n。

倒戈卸甲 发表于 2020-4-15 16:03:09

int Inserint(int sqlist[], int n, int i, int item)
{

    int t;
    if (n == MaxSize || i < 1 || i > n + 1)
      exit(0);
    for (t = n - 1; t >= i - 1; t--)
    {
      sqlist = sqlist;
    }
    sqlist = item;
    n = n + 1;

    return n;
}
int main()
{
    //创建一个静态顺序表
    int sqlist = { 1,2,4,5,6,7,8,9 };
    int n = 8;

    //打印出原来数组和数组长度
    printf("原来数组是:");
    for (int i = 0; i < n; i++)
    {
      printf("%d\t", sqlist);
    }
    printf("\n");
    printf("原来数组长度是:%d\n", n);

    //在数组的第三个位置插入数字3
    n=Inserint(sqlist, n, 3, 3);

    //打印出插入后的数组和数组长度
    printf("现在数组:");
    for (int i = 0; i < n; i++)
    {
      printf("%d\t", sqlist);
    }
    printf("\n");
    printf("现在数组长度:%d\n", n);
    return 0;
}

倒戈卸甲 发表于 2020-4-15 16:05:32

实际敲代码的时候发现还能更简单,那就是把Inserint函数里的n返回,调用该函数的时候用主函数里的n接收

倒戈卸甲 发表于 2020-4-15 16:11:54

void Inserint(int sqlist[], int* n, int i, int item)
{

    int t;
    if (*n == MaxSize || i < 1 || i > *n + 1)
      exit(0);
    for (t = *n - 1; t >= i - 1; t--)
    {
      sqlist = sqlist;
    }
    sqlist = item;
    *n += 1;
}
int main()
{
   //创建一个静态顺序表
    int sqlist = { 1,2,4,5,6,7,8,9 };
    int n = 8;
    int* p = &n;

    //打印出原来数组和数组长度
    printf("原来数组是:");
    for (int i = 0; i < n; i++)
    {
      printf("%d\t", sqlist);
    }
    printf("\n");
    printf("原来数组长度是:%d\n", n);

    //在数组的第三个位置插入数字3
    Inserint(sqlist, p, 3, 3);

    //打印出插入后的数组和数组长度
    printf("现在数组:");
    for (int i = 0; i < n; i++)
    {
      printf("%d\t", sqlist);
    }
    printf("\n");
    printf("现在数组长度:%d\n", n);
}
这是传入指针的版本

JerryLeeSir 发表于 2020-4-15 16:18:49

倒戈卸甲 发表于 2020-4-15 16:11
这是传入指针的版本

感激涕零,谢谢大神!!

倒戈卸甲 发表于 2020-4-15 16:19:31

耻思lhj 发表于 2020-4-15 15:58
指针不会你就把n的值return回来。。。
人家说的很详细了。
1,main里加一句 int* p=&n在上面


其实是我啰嗦了,直接打成代码一看就懂,但就是懒得去开电脑{:10_282:}
C新手有时会对指针有畏难情绪,主要还是语感没上来,尤其是这个解引用,*p写在一起就直接当普通变量用,常常让他们觉得别扭
页: [1]
查看完整版本: 救救孩子吧,顺序表问题求大神解答!