没有办法了,们看下顺序表的问题

C语言 码拜 4年前 (2017-05-03) 592次浏览
琢磨半天也没写出来,姓名用字符串传递不了参数,只能单个字符,用string,getchar,都传递不了姓名参数,问题在哪里?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define data 100
typedef struct L l;
typedef struct L
{

int a[data];
int b;
int c;
char name[data];
int age[data];
};
L student;

void f1(l *p,int n)
{
// if((p->a=(int *)malloc(n*sizeof(p->a)))==NULL)
//{
//                   printf(“内存申请错误!\n”);
//                 exit(-1);
//               }
p->b=0;
p->c=n;
}
int f2(l *p,int i,char T,int w,int j)
{
int q;
if(p->c==p->b)
return -1;
if(j<0)
j=0;
if(j>p->b)
j=p->b;
for(q=p->b-1;q>=j;q–)
{
p->a[q+1]=p->a[q];
p->name[q+1]=p->name[q];
p->age[q+1]=p->age[q];
}
p->a[j]=i;
p->name[j]=T;
p->age[j]=w;

p->b++;
return 0;
}
void f3(l *p)
{
int q;
for(q=0;q<p->b;q++)
{printf(“学号:%d\n”,p->a[q]);

printf(“姓名:%c\n”,p->name[q]);
printf(“年龄:%d\n”,p->age[q]);

}

}
int f4(l *p,int i)
{
int q;
for(q=0;q<p->b;q++)
if(p->a[q]==i)
return q;
return -1;
}
int f5(l *p,int i)
{
int q,t;
for(q=0;q<p->b;q++)
if(p->a[q]==i)
break;
if(q<p->b)
{
for(t=q;t<p->b-1;t++)
p->a[t]=p->a[t+1];
p->b–;
return q;

}
return 0;
}
int f6(l *p,int j)
{
int q;
if(j<0||j>p->b)
{
printf(“位置错误!\n”);
return -1;
}
for(q=j;q<p->b-1;q++)
p->a[q]=p->a[q+1];
p->b–;
return 0;
}
int main()
{
l pp;
l *e;
int q,t;
int item;
int A,C;

char B;
printf(“元素地址为%d\t元素长度为%d\t元素个数为%d\n”,pp.a,pp.b,pp.c);
f1(&pp,data);
printf(“元素地址为%d\t元素长度为%d\t元素个数为%d\n”,pp.a,pp.b,pp.c);
for(;;)
{ printf(“1、插入元素\t2、查找元素\t3、删除指定元素\t4、删除指定元素位置\t0、结束\n”);

scanf(“%d”,&item);
if(item==1)
{
while(1)
{
printf(“请输入学号\n”);
fflush(stdin);
scanf(“%d”,&A);
if(A==0)
break;
printf(“请输入姓名\n”);
fflush(stdin);
scanf(“%s”,&B);
if(B==0)
break;
printf(“请输入年龄\n”);
fflush(stdin);
scanf(“%d”,&C);
if(C==0)
break;
printf(“请输入插入位置!\n”);
fflush(stdin);
scanf(“%d”,&t);
f2(&pp,A,B,C,t-1);

printf(“学生信息管理系统:\n”);

f3(&pp);

}
}
if(item==2)
{
while(1)
{
printf(“请输入查找元素值,输入0结束查找操作!\n”);
fflush(stdin);
scanf(“%d”,&q);
if(q==0)
break;
t=f4(&pp,q);
if(t<0)
printf(“没有找到满足条件的元素值!\n”);
else

printf(“找到满足条件的元素值,位置为%d\n”,t+1);

}
}
if(item==3)
{
while(1)
{
printf(“请输入删除元素值,输入0结束删除操作!\n”);
fflush(stdin);
scanf(“%d”,&q);
if(q==0)
break;
t=f5(&pp,q);
if(t<0)
printf(“没有找到符合条件的元素值!\n”);
else
{
printf(“找到满足条件的元素值,位置为%d”,t+1);
printf(“线性表为:\n”);
f3(&pp);
}
}
}
if(item==4)
{
while(1)
{
printf(“请输入删除元素位置,输入0结束删除操作!\n”);
fflush(stdin);
scanf(“%d”,&t);
if(t==0)
break;
q=f6(&pp,t);
if(q<0)
printf(“没有找到符合人条件的元素值!\n”);
else
{
printf(“找到符合人条件的元素值,位置为%d”,t+1);
printf(“线性表为:\n”);
f3(&pp);
}
}

}
if(item==0)
exit(0); }
return 0;
}

解决方案

1

char *T

2

值传递   然并卵 嘿嘿

2

printf(“元素地址为%d\t元素长度为%d\t元素个数为%d\n”,pp.a,pp.b,pp.c);   这句pp没初始化就使用了

27

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define STU_NUM 100
typedef struct L l;
struct L
{
    int no[STU_NUM];
    int b;
    int c;
    char name[STU_NUM][32];
    int age[STU_NUM];
};
void init_info(l *p, int n)
{
    p->b = 0;
    p->c = n;
}
int insert_info(l *p, int no, char *T, int w, int j)
{
    int i;
    if(p->c == p->b)
        return -1;
    if(j < 0)
        j = 0;
    if(j > p->b)
        j = p->b;
    for(i = p->b-1; i >= j; i--)
    {
        p->no[i+1] = p->no[i];
        strcpy(p->name[i+1], p->name[i]);
        p->age[i+1] = p->age[i];
    }
    p->no[j] = no;
    strcpy(p->name[j], T);
    p->age[j] = w;
    p->b++;
    return 0;
}
void show_info(l *p)
{
    int i;
    for (i = 0; i < p->b; i++)
    {
        printf("学号:%d\n",p->no[i]);
        printf("姓名:%s\n",p->name[i]);
        printf("年龄:%d\n",p->age[i]);
    }
}
int search_info(l *p,int i)
{
    int q;
    for(q=0;q<p->b;q++)
        if(p->no[q] == i)
            return q;
    return -1;
}
int del_as_no(l *p, int no)
{
    int i, j;
    for (i = 0; i < p->b; i++)
        if(p->no[i] == no)
            break;
    if (i < p->b)
    {
        for (j = i; j < p->b-1; j++) {
            p->no[j]=p->no[j+1];
            strcpy(p->name[j], p->name[j+1]);
            p->age[j] = p->age[j+1];
        }
        p->b--;
        return i;
    }
    return 0;
}
int del_as_idx(l *p, int idx)
{
    int i;
    if (idx < 0 || idx > p->b) {
        printf("位置错误!\n");
        return -1;
    }
    for (i = idx; i < p->b-1; i++) {
        p->no[i] = p->no[i+1];
        strcpy(p->name[i], p->name[i+1]);
        p->age[i] = p->age[i+1];
    }
    p->b--;
    return 0;
}
int main()
{
    l pp;
    int q,t;
    int item;
    int A,C;
    char name[32];
    printf("元素地址为%p\t元素长度为%d\t元素个数为%d\n", pp.no, pp.b, pp.c);
    init_info(&pp, STU_NUM);
    printf("元素地址为%p\t元素长度为%d\t元素个数为%d\n", pp.no,pp.b,pp.c);
    for (;;) {
        printf("1、插入元素\t2、查找元素\t3、删除指定元素\t4、删除指定元素位置\t0、结束\n");
        scanf("%d", &item);
        if(item==1)
        {
            while(1)
            {
                printf("请输入学号\n");
                fflush(stdin);
                scanf("%d", &A);
                if(A == 0)
                    break;
                printf("请输入姓名\n");
                fflush(stdin);
                scanf("%s", name);
                if (strlen(name) <= 0)
                    break;
                printf("请输入年龄\n");
                fflush(stdin);
                scanf("%d", &C);
                if(C == 0)
                    break;
                printf("请输入插入位置!\n");
                fflush(stdin);
                scanf("%d", &t);
                insert_info(&pp, A, name, C, t-1);
                printf("学生信息管理系统:\n");
                show_info(&pp);
            }
        }
        if(item == 2)
        {
            while(1)
            {
                printf("请输入查找元素值,输入0结束查找操作!\n");
                fflush(stdin);
                scanf("%d",&q);
                if(q==0)
                    break;
                t = search_info(&pp, q);
                if(t < 0)
                    printf("没有找到满足条件的元素值!\n");
                else
                    printf("找到满足条件的元素值,位置为%d\n",t+1);
            }
        }
        if(item == 3)
        {
            while(1)
            {
                printf("请输入删除元素值,输入0结束删除操作!\n");
                fflush(stdin);
                scanf("%d",&q);
                if(q==0)
                    break;
                t = del_as_no(&pp, q);
                if(t<0)
                    printf("没有找到符合条件的元素值!\n");
                else
                {
                    printf("找到满足条件的元素值,位置为%d",t+1);
                    printf("线性表为:\n");
                    show_info(&pp);
                }
            }
        }
        if(item==4)
        {
            while(1)
            {
                printf("请输入删除元素位置,输入0结束删除操作!\n");
                fflush(stdin);
                scanf("%d",&t);
                if(t==0)
                    break;
                q = del_as_idx(&pp,t);
                if (q < 0) {
                    printf("没有找到符合人条件的元素值!\n");
                } else {
                    printf("找到符合人条件的元素值,位置为%d",t+1);
                    printf("线性表为:\n");
                    show_info(&pp);
                }
            }
        }
        if(item==0)
            exit(0); }
    return 0;
}

函数使用f1,f2,f3…,本人估计你过段时间再看这部分代码你也不知道f1,f2,f3…表示啥?
代码写出来除了要实现对应的功能也是让别人看的,让别人去帮你看也要别人首先了解你的代码功能,但是使用这样的函数名,谁看了都费解。总之,变量名和函数名一定要做到见名知义,假如想继续编程,或走的更远建议遵循这条规则。
代码风格建议注意下,该加空格的要加空格,该回车的要回车。
name不能直接赋值,但是可以借助库函数实现,例如strcpy,strncpy等等
改了许多,暂不一一罗列了,请查看上面的代码,有问题可以继续提出来。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明没有办法了,们看下顺序表的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)