| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 798 人关注过本帖
标题:设计的结构体,网友说有问题,不过找不出问题所在
只看楼主 加入收藏
linos
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-4-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
设计的结构体,网友说有问题,不过找不出问题所在
这个是题目要求。
图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册



这是employeeRecordT的结构。C语言不支持string 已对该部分作了修改


图片附件: 游客没有浏览图片的权限,请 登录注册


代码::
程序代码:
#include<stdio.h>
#include<stdlib.h>

typedef struct {
    char name[20];
    char title[20];
    char ssnum[20];
    double salary;
    int witholding ;
} employeeRecordT;

typedef struct {
    int num;
    employeeRecordT *info;
} *payrollT;

payrollT Getpayroll(payrollT result)
{
    int i = 1;
    result = (payrollT) malloc(sizeof(payrollT));
    scanf("%d",&result->num); // 输入员工个数
    result->info = (employeeRecordT *) malloc(sizeof(employeeRecordT) * result->num );    
    printf ("%d:",i);
        //输入每个员工信息
    scanf("%s%s%s%lf%d",&result->info->name, 
                        &result->info->title, 
                        &result->info->ssnum,
                        &result->info->salary,
                        &result->info->witholding);
    while (i < result->num) {
        result->info++; 
        i++;
        printf ("%d:",i);
        scanf("%s%s%s%lf%d",&result->info->name, 
                            &result->info->title, 
                            &result->info->ssnum,
                            &result->info->salary,
                            &result->info->witholding);    
    }
    result->info -= i-1; //指针前移
    return result;
}

int main()
{
    int i;
    payrollT emp;
    emp = Getpayroll(emp);
        //输出
    printf("How many employees: %d\n",emp->num);
    for ( i = 1; i < emp->num+1 ; emp->info++, i++)    {
        printf("Employee #%d\n",i);
        printf("    Name: %s\n",emp->info->name);
        printf("    Title: %s\n",emp->info->title);
        printf("    SSNum: %s\n",emp->info->ssnum);
        printf("    Salary: %.2lf\n",emp->info->salary);
        printf("    Withholding exemptions: %d\n",emp->info->witholding);
    }
    return 0;
}



代码能够顺利实现输出,不过我朋友说结构体定义有问题,我不知道是什么问题,请大家给与细心解答!

[ 本帖最后由 linos 于 2014-4-27 16:41 编辑 ]
搜索更多相关主题的帖子: 结构体 C语言 
2014-04-27 16:32
linos
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-4-27
收藏
得分:0 
在线等~~~~~~~~~~~~~~~~~~~~~

[ 本帖最后由 linos 于 2014-4-27 16:42 编辑 ]
2014-04-27 16:33
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
没觉得结构体定义错了。但是觉得你输入错了。
     //输入每个员工信息------应该把前三个的地址符去掉吧。真的能正常运行吗?
    scanf("%s%s%s%lf%d",result->info->name,
                        result->info->title,
                        result->info->ssnum,
                        &result->info->salary,
                        &result->info->witholding);
2014-04-27 18:17
linos
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-4-27
收藏
得分:0 
回复 3 楼 kwxx
刚才试了一下,都可以的

能再帮我看看吗,这么做符合题意吗?是内存分配那里有没有问题呢?
2014-04-27 19:15
嗜血老妖
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:2
帖 子:102
专家分:163
注 册:2013-3-25
收藏
得分:8 
感觉有好多的不对和不足啊,
1,你这是个单链表,没有头不好操作
2,后面创建的数据开辟的空间是一定的你应该发挥链表的优势,要多少有多少!
3,指针没有至空会有你想不到的后果
4,指针这样移动容易出错

纯属个人建议,一起努力!!!

仗剑走天涯,网络论英雄。
2014-04-27 19:34
linos
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-4-27
收藏
得分:0 
回复 5 楼 嗜血老妖
根据题意,看到结构的图时,就想到做
employeeRecordT 这个结构
程序代码:
typedef struct {
    char name[20];
    char title[20];
    char ssnum[20];
    double salary;
    int witholding ;
} employeeRecordT;


题意说要求payrollT为指针类型,employeeRecordT为动态数组,动态数组不怎么熟悉,翻了百度 就照下面的做

typedef struct {
    int num;
    employeeRecordT *info; //声明 员工记录为动态数组
} *payrollT;       //payrollT为指针类型


然后做了分配空间


    result = (payrollT) malloc(sizeof(payrollT));   //分配payrollT 空间
    result->info = (employeeRecordT *) malloc(sizeof(employeeRecordT) * result->num );  //根据员工人数 num , 分配 employeeRecordT 空间



之后就是一系列的操作了。

就不知道这么声明,这么分配空间,妥不妥。
2014-04-27 20:01
嗜血老妖
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:2
帖 子:102
专家分:163
注 册:2013-3-25
收藏
得分:0 
这样的话你只能存M个人的信息如果员工数目有变化呢???

仗剑走天涯,网络论英雄。
2014-04-27 20:13
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
从上边所给的图形看你的payrollT定义的不对,它的第二个成员应该是一个指向结构体指针数组的指针。即,应该定义成一个二级指针。不过这样一改,恐怕你的程序都得改了。
typedef struct {
    int num;
    employeeRecordT  **info;
} *payrollT;


[ 本帖最后由 kwxx 于 2014-4-27 20:16 编辑 ]
2014-04-27 20:15
嗜血老妖
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:2
帖 子:102
专家分:163
注 册:2013-3-25
收藏
得分:0 
程序代码:
////////////////////////////////////////////  
//单链表的初始化,建立,插入,查找,删除。//  
//Author:Wang Yong                        //      
//Date: 2010.8.19                         //  
////////////////////////////////////////////   
#include <stdio.h>  
#include <stdlib.h>  
typedef int ElemType;  
////////////////////////////////////////////   
//定义结点类型   
typedef struct Node  
{  
    ElemType data;              //单链表中的数据域   
    struct Node *next;          //单链表的指针域   
}Node,*LinkedList;  
////////////////////////////////////////////   
//单链表的初始化  
LinkedList LinkedListInit()  
{  
    Node *L;  
    L = (Node *)malloc(sizeof(Node));   //申请结点空间   
    if(L == NULL)                       //判断是否有足够的内存空间   
        printf("申请内存空间失败/n");  
    L->next = NULL;                  //将next设置为NULL,初始长度为0的单链表   
}  
////////////////////////////////////////////   
//单链表的建立1,头插法建立单链表  
LinkedList LinkedListCreatH()  
{  
    Node *L;  
    L = (Node *)malloc(sizeof(Node));   //申请头结点空间  
    L->next = NULL;                      //初始化一个空链表  
      
    ElemType x;                         //x为链表数据域中的数据  
    while(scanf("%d",&x) != EOF)  
    {  
        Node *p;  
        p = (Node *)malloc(sizeof(Node));   //申请新的结点   
        p->data = x;                     //结点数据域赋值   
        p->next = L->next;                    //将结点插入到表头L-->|2|-->|1|-->NULL   
        L->next = p;   
    }  
    return L;   
}   
////////////////////////////////////////////   
//单链表的建立2,尾插法建立单链表  
LinkedList LinkedListCreatT()  
{  
    Node *L;  
    L = (Node *)malloc(sizeof(Node));   //申请头结点空间  
    L->next = NULL;                  //初始化一个空链表  
    Node *r;  
    r = L;                          //r始终指向终端结点,开始时指向头结点   
    ElemType x;                         //x为链表数据域中的数据  
    while(scanf("%d",&x) != EOF)  
    {  
        Node *p;  
        p = (Node *)malloc(sizeof(Node));   //申请新的结点   
        p->data = x;                     //结点数据域赋值   
        r->next = p;                 //将结点插入到表头L-->|1|-->|2|-->NULL   
        r = p;   
    }  
    r->next = NULL;   
      
    return L;     
}  
////////////////////////////////////////////   
//单链表的插入,在链表的第i个位置插入x的元素  
LinkedList LinkedListInsert(LinkedList L,int i,ElemType x)  
{  
    Node *pre;                      //pre为前驱结点   
    pre = L;  
    int tempi = 0;  
    for (tempi = 1; tempi < i; tempi++)  
        pre = pre->next;                 //查找第i个位置的前驱结点   
    Node *p;                                //插入的结点为p  
    p = (Node *)malloc(sizeof(Node));  
    p->data = x;   
    p->next = pre->next;  
    pre->next = p;  
      
    return L;                             
}   
////////////////////////////////////////////   
//单链表的删除,在链表中删除值为x的元素  
LinkedList LinkedListDelete(LinkedList L,ElemType x)  
{  
    Node *p,*pre;                   //pre为前驱结点,p为查找的结点。   
    p = L->next;  
    while(p->data != x)              //查找值为x的元素   
    {     
        pre = p;   
        p = p->next;  
    }  
    pre->next = p->next;          //删除操作,将其前驱next指向其后继。   
    free(p);  
    return L;  
}   
/////////////////////////////////////////////  
int main()  
{  
    LinkedList list,start;  
/*  printf("请输入单链表的数据:");  
    list = LinkedListCreatH(); 
    for(start = list->next; start != NULL; start = start->next) 
        printf("%d ",start->data); 
    printf("/n"); 
*/  printf("请输入单链表的数据:");   
    list = LinkedListCreatT();  
    for(start = list->next; start != NULL; start = start->next)  
        printf("%d ",start->data);  
    printf("/n");  
    int i;  
    ElemType x;  
    printf("请输入插入数据的位置:");  
    scanf("%d",&i);  
    printf("请输入插入数据的值:");  
    scanf("%d",&x);  
    LinkedListInsert(list,i,x);  
    for(start = list->next; start != NULL; start = start->next)  
        printf("%d ",start->data);  
    printf("/n");  
    printf("请输入要删除的元素的值:");  
    scanf("%d",&x);  
    LinkedListDelete(list,x);   
    for(start = list->next; start != NULL; start = start->next)  
        printf("%d ",start->data);  
    printf("/n");  
      
    return 0;  
}   

参考下

仗剑走天涯,网络论英雄。
2014-04-27 20:18
嗜血老妖
Rank: 3Rank: 3
来 自:江西
等 级:论坛游侠
威 望:2
帖 子:102
专家分:163
注 册:2013-3-25
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

仗剑走天涯,网络论英雄。
2014-04-27 20:25
快速回复:设计的结构体,网友说有问题,不过找不出问题所在
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.119524 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved