c语言数据结构问题

有个问题是这样的:从顺序表s中删除其值为j的所有字符。下面是我写的程序。。。。。#include<stdio.h>#include<stdlib.h>#include<s... 有个问题是这样的:从顺序表s中删除其值为j的所有字符。下面是我写的程序。。。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
char ch[10];
int len;
}dui;
void fuzhi(dui *s,char *tral)/*建立一个定长顺序串*/
{
int i=0,leng=0;
while(tral[i]!='\0') i++;
leng=i;
for(i=0;i<leng;i++)
s->ch[i]=tral[i];
s->len=leng;
}

int shanchu1(dui *s,int a)
{
int i;
char *temp;
temp=(char *)malloc(s->len-1);
if(temp==NULL)
return 0;
else
for(i=0;i<a-1;i++)
temp[i]=s->ch[i];
for(i=a;i<s->len;i++)
temp[i-1]=s->ch[i];
for(i=0;i<s->len;i++)
s->ch[i]=temp[i];
s->len--;
return 1;
}
void shanchu(dui *s,char a)
{
int i;
for(i=0;i<s->len;i++)
if(s->ch[i]==a)
shanchu1(s,i);/*每发现一个即删除*/
}

void main()
{
int i,j,k;
dui *s;
char a[10];
printf("请输入\n");
gets(a);
fuzhi(s,a);
for(i=0;i<s->len;i++)
putchar(s->ch[i]);
printf("\n");
shanchu(s,'j');
for(i=0;i<s->len;i++)
putchar(s->ch[i]);

}
编译时没有问题,但是运行后一输入值,就会弹出个对话框,说这个文件发生了未经处理的win32异常,到底是为什么啊,请各位帮忙找找我这个程序哪里有错误啊。。。。。。
错误如图所示
下面这个简单的程序也是这个错误
#include<stdio.h>
typedef struct stu
{
char a[10];
int leng;
}stu;
void shuru(stu *s,char *temp)
{
int i=0,j,k;
while(temp[i]!='\0')
i++;
for(j=0;j<i;j++)
s->a[j]=temp[i];
s->leng=i;
}
void main()
{
int i;
stu *s;
char a[10];
gets(a);
for(i=0;i<s->leng;i++)
putchar(s->a[i]);
}
到底是为什么啊,我在看数据结构“串”这一章,不知道怎么出现这个问题.............
展开
 我来答
k高人
2011-08-04 · TA获得超过700个赞
知道小有建树答主
回答量:561
采纳率:0%
帮助的人:147万
展开全部
#include<stdio.h>//请注意看注释,指出了你的问题,其实你的删除函数太复杂,等会给你一个简单的
#include<stdlib.h>
#include<string.h>//既然包含了这个头文件,为什么不用函数呢,还要自己用那么多循环
typedef struct student
{
char ch[10];
int len;
}dui;
void fuzhi(dui *s,char *tral)/*建立一个定长顺序串*/
{
int i=0,leng=0;
// while(tral[i]!='\0') i++;
// leng=i;
// for(i=0;i<leng;i++)
// s->ch[i]=tral[i];
strcpy(s->ch,tral);//字符串拷贝函数
// s->len=leng;
s->len=strlen(tral);//字符串长度函数
}

int shanchu1(dui *s,int a)//你这个是要删除指定下标的字符吧
{
int i;
int c;//注意,temp下标,两个数组的下标并不一定一直,因为有字符被删除了
char *temp;
// temp=(char *)malloc(s->len-1);
temp=(char *)malloc(s->len);//长度比最大下标大1,不要减
if(temp==NULL)
return 0;
else
// for(i=0;i<a-1;i++)
// temp[i]=s->ch[i];
// for(i=a;i<s->len;i++)
// temp[i-1]=s->ch[i];
for(c=0,i=0;i<s->len;i++)//看怎样控制条件
{//跳过下标a,其他的直接赋值到temp
if(i!=a)
{
temp[c]=s->ch[i]; //注意这样写:你这里写反了
c++;//取得要保留的字符,则后移
}
}
strcpy(s->ch,temp);//再把temp中字符赋回结构体ch中
s->len=c;//取temp新的长度
free(temp);//注意,要释放内存
return 1;
}
void shanchu(dui *s,char a)//这部分完全正确
{
int i;
for(i=0;i<s->len;i++)
if(s->ch[i]==a)
shanchu1(s,i);/*每发现一个即删除*/
}

void main()
{
int i,j,k;
dui *s;//特别注意,这里只是一个指针
char a[10];

printf("请输入\n");
gets(a);
a[9]='\0';//防止你的数组越界
s=(dui *)malloc(sizeof(dui));//没有这个就是致命错误,无内存可写,导致运行时弹出对话框
fuzhi(s,a);

for(i=0;i<s->len;i++)
putchar(s->ch[i]);

printf("\n");

shanchu(s,'j');

for(i=0;i<s->len-1;i++)//注意:字符串的最大下标是s->len-1要记得减1
putchar(s->ch[i]);
printf("\n");
}
LastAreas
2011-08-04 · 超过15用户采纳过TA的回答
知道答主
回答量:31
采纳率:0%
帮助的人:32.1万
展开全部
上面一段代码太长了,没看,就下面一段代码来说,你犯的错误是初学者经常犯的错误:没有分配内存。
声明s以后,s指向一个错误的地址,必须显示的为s分配内存:
stu *s = (stu*)malloc(sizeof(stu));
而且你在main函数里面没有给s的成员赋值,在打印时会产生未知的错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友87595fa
2011-08-04 · TA获得超过188个赞
知道答主
回答量:131
采纳率:0%
帮助的人:34.5万
展开全部
你那个shanchu1函数要返回值干什么,可以去掉试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
前今歌095
2011-08-04 · TA获得超过181个赞
知道小有建树答主
回答量:328
采纳率:0%
帮助的人:231万
展开全部
可能你的vs出问题了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式