C语言实现学生通讯录,查找添加一次可以正常运行,在添加一次不能正常运行(往后添加重复),删除运行时程序直接终止了。求大佬帮帮忙,解决一下问题

#include
#include
#include
typedef struct student{
char name[20];
char number[20];
}ss;
typedef struct ssss{
int size;
ss array;
}Array;
Array acreat (int asize) //开辟空间
{
Array a;
a.size=asize;
a.array=(ss
)malloc(sizeof(ss)*asize);
return a;
}
void afree(Array a) //回收空间
{
free(a->array);
a->array=NULL;
a->size=0;
}
void agrow(Array
a,int moresize) //数组的增长
{
ss p=(ss *)malloc(sizeof(ss)(a->size+moresize));
for(int i=0;isize;i++)
{
p[i]=a->array[i];
}
free(a->array);
a->array=p;
a->size+=moresize;
}
void apaixu(Array a)
{
ss t;
for(int i=0;i<(a->size-1);i++)
{
for(int j=0;j<(a->size-i-1);j++)
{
if(strcmp(a->array[j].name,a->array[j+1].name)>0)
{
t=a->array[j];
a->array[j]=a->array[j+1];
a->array[j+1]=t;
}
}
}
}
void atianjia(char
cname,char cnumber,Array *a)
{
agrow(a,1);
strcpy(a->array[a->size-1].name,cname);
strcpy(a->array[a->size-1].number,cnumber);
apaixu(a);
}
void achazhao(char *cname,Array *a)
{
for(int i=0;isize;i++)
{
int r=strcmp(cname,a->array[i].name);
if(r==0)
{
printf("%s,%s\n",a->array[i].name,a->array[i].number);
break;
}
else if(r!=0&&++i==a->size)
{
printf("查无此人\n");
}
}
}
void ashanchu(char *cname,Array *a)
{
int r;
for(int i=0;isize;i++)
{
r=strcmp(cname,a->array[i].name);
if(r==0&&i<(a->size-1)) //删除首项中间项
{
int g;
for(g=i;gsize-1;g++)
{
a->array[g]=a->array[g+1];
}
// free(&(a->array[g]));
agrow(a,-1);
}
else if(r==0&&i==(a->size-1)) //删除最后一项
{
// free(&a->array[i]);
agrow(a,-1);
}
else if(r!=0&&++i==(a->size))
{
printf("查无此人\n");
}
}
}
void aprint(Array *a)
{
for(int i=0;isize;i++)
{
printf("%s %s\n",a->array[i].name,a->array[i].number);
}
}
int main()
{
Array acreat (int asize); //开辟空间
void afree(Array *a); //回收空间
void agrow(Array
a,int moresize); //数组的增长
// ss *afangwen(Array *a,int index,char); //访问单元
void apaixu(Array *a);
void atianjia(char *cname,char *cnumber,Array *a);
void ashanchu(char *cname,Array *a);
void achazhao(char *cname,Array *a);
void aprint(Array *a);
Array a=acreat(3);
printf("输入姓名电话号:\n");
for(int i=0;i<3;i++)
{
scanf("%s %s",&a.array[i].name,&a.array[i].number);
}
apaixu(&a);
aprint(&a);
while(1)
{
printf("添加按1,删除按2,查找按3,打印按4,结束按-1\n");
int i;
scanf("%d",&i);
if(i==1)
{
printf("输入添加学生姓名电话号:\n");
char name[20],number[20];
scanf("%s %s",&name,&number);
atianjia(name,number,&a);
}
if(i==2)
{
printf("输入删除学生姓名:");
char name[20];
scanf("%s",&name);
ashanchu(name,&a);
}
if(i==3)
{
printf("输入查找学生姓名:");
char name[20];
scanf("%s",&name);
achazhao(name,&a);
}
if(i==4)
{
aprint(&a);
}
if(i==-1)
{
break;
}
}
afree(&a);

return 0;
}

2个回答

ss p=(ss *)malloc(sizeof(ss)(a->size+moresize));
这里你少了2个星号
应该是

ss * p=(ss *)malloc(sizeof(ss)*(a->size+moresize));

麻烦把格式改一下,你这个代码太不容易看了,以下是总结的问题,貌似格式问题吞了不少星号,可能主要问题就是最后一个。另外简单简化了一下你的代码,在最后供参考。

//这句有问题,变量类型应该也是ss*
ss p=(ss *)malloc(sizeof(ss)(a->size+moresize));
//这里的ss应该是想存数组吧,起码应该写成array[]的形式,不过因为后面需要用malloc赋值,应该写ss* array。
typedef struct ssss{
    int size;
    ss array;
}Array;
//你传Array类型的变量时候的类型定义很混乱,有传值有传指针,这里隐患很大;因为这个类型包含分配的内存指针,最好使用引用传递,或者传指针。
void afree(Array a) {
void agrow(Array a,int moresize)
//应该写
void afree(Array *a) //其他一样处理
//这里你传了两个指针进去,而函数变量类型是传值
apaixu(&a);
aprint(&a); 
//在插入是输入信息这句的scanf应该传指针,而name和number已经是指针了,不用再加&
char name[20],number[20];
scanf("%s %s",&name,&number);

先不说为什么会出错,你这个程序问题太多了,我得慢慢改,你自己如果能看到回帖也自己改改,不懂就问。
另外有很多代码被你的格式吞掉了,因为你没放到代码片里,不知道是你没写还是格式吞掉的,建议提供点其他信息。
基本上改掉这些有问题的代码就运行通了,我改完的如下

#include <stdlib.h> 
#include <stdio.h>
#include <string.h>
typedef struct student{
    char name[20];
    char number[20];
}ss;

typedef struct ssss{
    int size;
    ss* array;
}Array;

Array acreat (int asize) {
    Array a;
    a.size = asize;
    a.array = (ss*)malloc(sizeof(ss)*asize);
    return a;
}

void afree(Array* a) {
    free(a->array);
    a->array = NULL;
    a->size=0;
}

void agrow(Array* a,int moresize) {
    ss* p=(ss *)malloc(sizeof(ss) * (a->size+moresize));
    for( int i = 0; i < a->size && i < a->size + moresize; i++)
        p[i]=a->array[i];

    free(a->array);
    a->array=p;
    a->size+=moresize;
}

void aPaiXu(Array* a) {
    ss t;
    for( int i = 0; i < (a->size-1); i++ ) 
        for( int j = 0; j < (a->size-i-1); j++ ) 
            if( strcmp(a->array[j].name, a->array[j+1].name) > 0 ) {
                t = a->array[j];
                a->array[j] = a->array[j+1];
                a->array[j+1] = t;
            }
}
void aTianJia(char* cname,char* cnumber,Array *a) {
    agrow(a, 1); 
    strcpy( a->array[a->size-1].name, cname );
    strcpy( a->array[a->size-1].number, cnumber );
    aPaiXu(a);
}
void aChaZhao(char *cname,Array *a) {
    for( int i = 0; i < a->size; i++ ) {
        int r = strcmp( cname, a->array[i].name );
        if( r==0 ) {
            printf( "%s, %s\n", a->array[i].name, a->array[i].number);
            break; 
        } else if( r!=0 && ++i == a->size )
            printf("查无此人\n");

    }
}
void aShanChu(char *cname,Array *a) {
    for( int i = 0; i < a->size; i++ ) {
        int r = strcmp( cname, a->array[i].name );
        if( r==0 && i < (a->size-1) ) {
            for( int g = i; g < a->size-1; g++) 
                a->array[g]=a->array[g+1]; 
            agrow(a,-1);
        else if( r==0 && i == (a->size-1) )
            agrow(a,-1);
        else if( r!=0 && ++i == (a->size) )
            printf("查无此人\n");
    }
}
void aPrint(Array *a) {
    for( int i = 0; i < a->size; i++ )
        printf("%s %s\n",a->array[i].name,a->array[i].number);
}
int main() {
    Array a=acreat(3);
    printf("输入姓名电话号:\n");
    for( int i = 0; i < 3; i++ )
        scanf("%s %s",&a.array[i].name,&a.array[i].number);

    aPaiXu(&a);
    aPrint(&a); 

    while(1) {
        printf("添加按1,删除按2,查找按3,打印按4,结束按-1\n");
        int i;
        scanf("%d",&i);
        if(i==1) {
            printf("输入添加学生姓名电话号:\n");
            char name[20],number[20];
            scanf("%s %s",name,number);
            aTianJia(name,number,&a);
        }
        if(i==2) {
            printf("输入删除学生姓名:");
            char name[20];
            scanf("%s",&name);
            aShanChu(name,&a);
        }
        if(i==3) {
            printf("输入查找学生姓名:");
            char name[20];
            scanf("%s",&name);
            aChaZhao(name,&a);
        } 
        if(i==4) 
            aPrint(&a);

        if(i==-1) 
            break;
    }
    afree(&a);

    return 0;
}

运行结果
图片说明

JonathanYan
JonathanYan 回复邪魔邪魔邪魔退散: 修改了agrow,我这边没问题了
4 个月之前 回复
JonathanYan
JonathanYan 回复邪魔邪魔邪魔退散: 你那个agrow的for循环在删除后有越界的问题,因为新分配的内存小于原内存
4 个月之前 回复
JonathanYan
JonathanYan 回复邪魔邪魔邪魔退散: 那你应该是还有别的问题,我这个代码放过去能跑吗
4 个月之前 回复
JonathanYan
JonathanYan 回复邪魔邪魔邪魔退散: 我这里没问题,你把运行结果发上来看看
4 个月之前 回复
qq_43480347
邪魔邪魔邪魔退散 回复: 谢谢大哥帮我改这些问题 不过代码还是运行不了。删除总是运行不对
4 个月之前 回复
qq_43480347
邪魔邪魔邪魔退散 我的代码里是ss * p=(ss *)malloc(sizeof(ss)*(a->size+moresize)); 复制上来就没*了还有scanf里那个传值加不加&都一样
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问