鱼C论坛

 找回密码
 立即注册
查看: 761|回复: 13

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

[复制链接]
发表于 2020-4-15 13:37:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题是关于顺序表插入元素的,我在顺序表里插入了一个元素,打印时顺序表里确实插入了
我输入的元素,但是顺序表长度没有增加,我知道我传入子函数的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[t+1]=sqlist[t];
    }
    sqlist[i-1]=item;
    n=n+1;
   
}

int main()
{

    //创建一个静态顺序表
    int sqlist[MaxSize]={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 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[t + 1] = sqlist[t];
    }
    sqlist[i - 1] = item;
    *n += 1;
}
int main()
{
   //创建一个静态顺序表
    int sqlist[MaxSize] = { 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[i]);
    }
    printf("\n");
    printf("原来数组长度是:%d\n", n);

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

    //打印出插入后的数组和数组长度
    printf("现在数组:");
    for (int i = 0; i < n; i++)
    {
        printf("%d\t", sqlist[i]);
    }
    printf("\n");
    printf("现在数组长度:%d\n", n);
}
这是传入指针的版本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-15 13:53:46 From FishC Mobile | 显示全部楼层
本帖最后由 倒戈卸甲 于 2020-4-15 15:03 编辑

把解决方案放到最新回复里面了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

可是我数组长度是100啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-15 14:35:01 From FishC Mobile | 显示全部楼层
本帖最后由 倒戈卸甲 于 2020-4-15 15:04 编辑
JerryLeeSir 发表于 2020-4-15 14:16
可是我数组长度是100啊


没毛病,外部的n不改变啥都不好使,你打印的时候始终只能打印8个数。函数不能以传值的方式传n。定义函数的时候,写作int& n,传个引用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-15 14:36:39 | 显示全部楼层
因为你的n还是8,在函数里的n+1,是不会影响到原来的n的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-15 14:55:26 From FishC Mobile | 显示全部楼层
函数名变为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,也行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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的话会报错,第二种方法我过不了编译,求大神再指导一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

忘了你这是纯C的程序了,你等我开个电脑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[t + 1] = sqlist[t];
    }
    sqlist[i - 1] = item;
    n = n + 1;

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

    //打印出原来数组和数组长度
    printf("原来数组是:");
    for (int i = 0; i < n; i++)
    {
        printf("%d\t", sqlist[i]);
    }
    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[i]);
    }
    printf("\n");
    printf("现在数组长度:%d\n", n);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-15 16:05:32 | 显示全部楼层
实际敲代码的时候发现还能更简单,那就是把Inserint函数里的n返回,调用该函数的时候用主函数里的n接收
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[t + 1] = sqlist[t];
    }
    sqlist[i - 1] = item;
    *n += 1;
}
int main()
{
   //创建一个静态顺序表
    int sqlist[MaxSize] = { 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[i]);
    }
    printf("\n");
    printf("原来数组长度是:%d\n", n);

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

    //打印出插入后的数组和数组长度
    printf("现在数组:");
    for (int i = 0; i < n; i++)
    {
        printf("%d\t", sqlist[i]);
    }
    printf("\n");
    printf("现在数组长度:%d\n", n);
}
这是传入指针的版本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-15 16:18:49 | 显示全部楼层
倒戈卸甲 发表于 2020-4-15 16:11
这是传入指针的版本

感激涕零,谢谢大神!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

其实是我啰嗦了,直接打成代码一看就懂,但就是懒得去开电脑
C新手有时会对指针有畏难情绪,主要还是语感没上来,尤其是这个解引用,*p写在一起就直接当普通变量用,常常让他们觉得别扭
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 06:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表