救救孩子吧,顺序表问题求大神解答!
问题是关于顺序表插入元素的,我在顺序表里插入了一个元素,打印时顺序表里确实插入了我输入的元素,但是顺序表长度没有增加,我知道我传入子函数的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 15:03 编辑
把解决方案放到最新回复里面了 倒戈卸甲 发表于 2020-4-15 13:53
插入元素的函数弄错了,也就是你第一个函数。显然要先把数组长度加1,然后从序号i开始,依次往后挪。不然你 ...
可是我数组长度是100啊
本帖最后由 倒戈卸甲 于 2020-4-15 15:04 编辑
JerryLeeSir 发表于 2020-4-15 14:16
可是我数组长度是100啊
没毛病,外部的n不改变啥都不好使,你打印的时候始终只能打印8个数。函数不能以传值的方式传n。定义函数的时候,写作int& n,传个引用 因为你的n还是8,在函数里的n+1,是不会影响到原来的n的。 函数名变为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,也行。 倒戈卸甲 发表于 2020-4-15 14:55
函数名变为void Inserint(int sqlist[],int& n,int i,int item);其它代码不动,n的修改就能影响外部了。
...
C语言里没有引用,C++才行,C用int &n的话会报错,第二种方法我过不了编译,求大神再指导一下{:5_109:} JerryLeeSir 发表于 2020-4-15 15:53
C语言里没有引用,C++才行,C用int &n的话会报错,第二种方法我过不了编译,求大神再指导一下
忘了你这是纯C的程序了,你等我开个电脑 本帖最后由 耻思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。
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;
} 实际敲代码的时候发现还能更简单,那就是把Inserint函数里的n返回,调用该函数的时候用主函数里的n接收 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);
}
这是传入指针的版本 倒戈卸甲 发表于 2020-4-15 16:11
这是传入指针的版本
感激涕零,谢谢大神!! 耻思lhj 发表于 2020-4-15 15:58
指针不会你就把n的值return回来。。。
人家说的很详细了。
1,main里加一句 int* p=&n在上面
其实是我啰嗦了,直接打成代码一看就懂,但就是懒得去开电脑{:10_282:}
C新手有时会对指针有畏难情绪,主要还是语感没上来,尤其是这个解引用,*p写在一起就直接当普通变量用,常常让他们觉得别扭
页:
[1]