好心人帮我看一下我这段C语言程序哪里出错了!!!

软件和网站开发以及相关技术探讨
sordidpace
帖子: 13
注册时间: 2008-08-22 21:52

好心人帮我看一下我这段C语言程序哪里出错了!!!

#1

帖子 sordidpace » 2009-10-09 23:22

这是段线性表插入程序
#include <stdio.h>
#include <stdlib.h>
#define maxlen 100
struct sqlisttp
{
int elem[maxlen];
int last;
};
struct sqlisttp v;
void insert(struct sqlisttp v,int i,int x)
{
int k;
if(i<1||i>k+1)
printf("The position is not suitable\n");
else if(k>=maxlen-1)
printf("the table is full\n");
else
for(k=v.last;k>=i;k--)
v.elem[k+1]=v.elem[k];
v.elem=x;
v.last++;
}

void main()
{
void insert(struct sqlisttp v,int i,int x);
struct sqlisttp w;
int i,j,k;
int a[]={21,32,5,18,66};
for(i=0;i<=4;i++)
w.elem=a;
printf("The original elember is\n");
for(j=0;j<=4;j++)
printf("%d ",a[j]);
printf("\nPress Enter to continue");
getchar();
insert(w,4,58);
printf("The new elember is\n");
for(k=0;k<=5;k++)
printf("%d ",w.elem[k]);
}
我不知道为什么最后结果总是不对的 那段insert函数貌似就没有调用 想了两个礼拜还没搞清楚。。 题目是在21 32 5 18 66第4个位置插入58。在线等结果!很急!!!!
头像
slax
帖子: 1099
注册时间: 2009-08-17 3:52

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#2

帖子 slax » 2009-10-09 23:57

不说算法问题(很。。。),你的语法倒是有很多坏习惯,手机没法编译,屏幕不大,翻翻又难看,你先把mian里的函数声明给删了,把Insert上面的V的声明删了吧,没用的语句,看不下去,你先试一下
 

该条信息是由slax用户用手机Ubuntu发出的,我也要用手机发送Ubuntu信息(详情请登录3g.ubuntu.org查询)
We believe that the internet should be public, open and accessible.
软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。
iceplayer! linux音乐新体验~ 最新版本4.0.5-20110520已更新!viewtopic.php?f=137&t=252461
想要iceplayer 测试版麼?加入QQ群80071264吧,在code.google也可找到
http://www.iceplayer.org/
http://jasy.ice.blog.163.com/
sordidpace
帖子: 13
注册时间: 2008-08-22 21:52

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#3

帖子 sordidpace » 2009-10-10 0:13

恩~试了,还是错的 build是没有问题的 就是运行出来的不知道什么东西 :em06 哦,算法应该对的,只是我没有系统的学过C语言,都是自己东拼西凑看来的~ 所以语法上。。见谅阿~ :em06
头像
slax
帖子: 1099
注册时间: 2009-08-17 3:52

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#4

帖子 slax » 2009-10-10 0:26

推荐你看一下链表的内容,即每个指针记录前一个指针地址和数据再加后一个指针地址,在数据大量膨胀的时候你就知道只改变两个数据的方法和改变后面每一个数据的值的方法相比又多麽。。当然,这只是一个例子 我再看一下




该条信息是由slax用户用手机Ubuntu发出的,我也要用手机发送Ubuntu信息(详情请登录3g.ubuntu.org查询)
We believe that the internet should be public, open and accessible.
软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。
iceplayer! linux音乐新体验~ 最新版本4.0.5-20110520已更新!viewtopic.php?f=137&t=252461
想要iceplayer 测试版麼?加入QQ群80071264吧,在code.google也可找到
http://www.iceplayer.org/
http://jasy.ice.blog.163.com/
头像
lerosua
论坛版主
帖子: 8455
注册时间: 2007-11-29 9:41
联系:

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#5

帖子 lerosua » 2009-10-10 0:26

首先,你要搞清函数传值和传址的区别。
你的程序中insert中,传进去的是值 。就是说,你把struct sqlisttp v传进去了,但,在这个函数里面,它只是复制了这个结构的值 。 到退出函数的时候,作用的是v的拷贝。而真正的v是没有变的。也就是insert做无用功了。所以你insert里的算法无论多么正确都没用。

代码: 全选

void insert(struct sqlisttp v,int i,int x)
所以你的程序打印出来最后一个是个随机值。
像这样

代码: 全选

./a.out 
The original elember is
21 32 5 18 66 
Press Enter to continue
The position is not suitable
The new elember is
21 32 5 18 66 -1215541100 
头像
lerosua
论坛版主
帖子: 8455
注册时间: 2007-11-29 9:41
联系:

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#6

帖子 lerosua » 2009-10-10 0:30

代码: 全选

int k;
if(i<1||i>k+1)
这种写法,是存在潜在bug的,k没初始化,就用i来和它比较,结果完全不可预知。
头像
lerosua
论坛版主
帖子: 8455
注册时间: 2007-11-29 9:41
联系:

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#7

帖子 lerosua » 2009-10-10 0:33

代码: 全选

for(i=0;i<=4;i++)
w.elem[i]=a[i];
这里初始化结构体,又不把last带上,后面在函数里,又直接用上了last变量...
sordidpace
帖子: 13
注册时间: 2008-08-22 21:52

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#8

帖子 sordidpace » 2009-10-10 0:36

lerosua 写了:

代码: 全选

for(i=0;i<=4;i++)
w.elem[i]=a[i];
这里初始化结构体,又不把last带上,后面在函数里,又直接用上了last变量...
请问您有办法在我这段程序的基础上改正吗? 我想作为参考~
头像
slax
帖子: 1099
注册时间: 2009-08-17 3:52

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#9

帖子 slax » 2009-10-10 0:38

首先,你的last没有赋值,所以你的For(k等于V.last。。。)那句是废的,再次,你的Struct不是实型参数,传递值非指针而是复制值,

解决?last赋上值,用指针传递或用全局变量。 手机打字好累,还要打代码@。。。。。



该条信息是由slax用户用手机Ubuntu发出的,我也要用手机发送Ubuntu信息(详情请登录3g.ubuntu.org查询)
We believe that the internet should be public, open and accessible.
软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。
iceplayer! linux音乐新体验~ 最新版本4.0.5-20110520已更新!viewtopic.php?f=137&t=252461
想要iceplayer 测试版麼?加入QQ群80071264吧,在code.google也可找到
http://www.iceplayer.org/
http://jasy.ice.blog.163.com/
头像
slax
帖子: 1099
注册时间: 2009-08-17 3:52

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#10

帖子 slax » 2009-10-10 0:41

哦,有人说出来了?早知不打那么多字了。

该条信息是由slax用户用手机Ubuntu发出的,我也要用手机发送Ubuntu信息(详情请登录3g.ubuntu.org查询)
We believe that the internet should be public, open and accessible.
软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。
iceplayer! linux音乐新体验~ 最新版本4.0.5-20110520已更新!viewtopic.php?f=137&t=252461
想要iceplayer 测试版麼?加入QQ群80071264吧,在code.google也可找到
http://www.iceplayer.org/
http://jasy.ice.blog.163.com/
头像
lerosua
论坛版主
帖子: 8455
注册时间: 2007-11-29 9:41
联系:

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#11

帖子 lerosua » 2009-10-10 0:42

代码: 全选

#include <stdio.h>
#include <stdlib.h>
#define maxlen 100
struct sqlisttp {
	int elem[maxlen];
	int last;
};
//struct sqlisttp v;
void insert(struct sqlisttp *v, int i, int x)
{
	int k=0;
	/*
	if (i < 1 || i > k + 1)
		printf("The position is not suitable\n");
	else if (k >= maxlen - 1)
		printf("the table is full\n");
	else
	*/
		for (k = v->last; k >= i; k--)
			v->elem[k + 1] = v->elem[k];
	v->elem[i] = x;
	v->last++;
}

void main()
{
//	void insert(struct sqlisttp v, int i, int x);
	struct sqlisttp w;
	int i, j, k;
	int a[] = { 21, 32, 5, 18, 66 };
	for (i = 0; i <= 4; i++)
		w.elem[i] = a[i];
	w.last=5;
	printf("The original elember is\n");
	for (j = 0; j <= 4; j++)
		printf("%d ", a[j]);
	printf("\nPress Enter to continue");
	getchar();
	insert(&w, 4, 58);
	printf("The new elember is\n");
	for (k = 0; k <= 5; k++)
		printf("%d ", w.elem[k]);
	printf("\n");
}
运行通过了.
头像
lerosua
论坛版主
帖子: 8455
注册时间: 2007-11-29 9:41
联系:

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#12

帖子 lerosua » 2009-10-10 0:43

代码: 全选

 ./a.out 
The original elember is
21 32 5 18 66 
Press Enter to continue
The new elember is
21 32 5 18 58 66 
结果
头像
slax
帖子: 1099
注册时间: 2009-08-17 3:52

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#13

帖子 slax » 2009-10-10 0:45

K 不赋初值哪个补充一下,部分编译器会警告,并赋值为0,如Gcc 部分会提示警告,但不赋值,结果直接错误,还有一部分直接提示错误
We believe that the internet should be public, open and accessible.
软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。
iceplayer! linux音乐新体验~ 最新版本4.0.5-20110520已更新!viewtopic.php?f=137&t=252461
想要iceplayer 测试版麼?加入QQ群80071264吧,在code.google也可找到
http://www.iceplayer.org/
http://jasy.ice.blog.163.com/
sordidpace
帖子: 13
注册时间: 2008-08-22 21:52

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#14

帖子 sordidpace » 2009-10-10 0:49

看懂了!!就是用指针 谢谢你们两个!!我再自己试试全局变量的方法
再额外问个问题~ 有什么系统点学习C语言的书推荐下吗? 或者C语言学习的群啦之类的 :em02
头像
slax
帖子: 1099
注册时间: 2009-08-17 3:52

Re: 好心人帮我看一下我这段C语言程序哪里出错了!!!

#15

帖子 slax » 2009-10-10 1:08

有大学就认真听课吧,书?无数人推荐候哥的,我推荐the c program language,真的很不错 加一点,,,,,无论如何,编程其实最重要的还是多码代码,祝福你不要成为代码民工,命苦啊。 




该条信息是由slax用户用手机Ubuntu发出的,我也要用手机发送Ubuntu信息(详情请登录3g.ubuntu.org查询)
We believe that the internet should be public, open and accessible.
软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。
iceplayer! linux音乐新体验~ 最新版本4.0.5-20110520已更新!viewtopic.php?f=137&t=252461
想要iceplayer 测试版麼?加入QQ群80071264吧,在code.google也可找到
http://www.iceplayer.org/
http://jasy.ice.blog.163.com/
回复