| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1266 人关注过本帖
标题:前辈帮忙指导,里面的程序有些问题想请教
取消只看楼主 加入收藏
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
前辈帮忙指导,里面的程序有些问题想请教
程序代码:

#include <stdio.h>
#include <stdlib.h>

struct sdu_info{
    int number;    //学号
    int sex;    //0为男,1为女
    int age;    //年龄
    int class;    //班级代码
    int counter;    //成绩分数
    struct sdu_info * next;    //节点指针
};

typedef struct sdu_info Sdu;    //Sdu链表
typedef Sdu * SduPtr;    //Sdu链表指针

int input(int i);
void set(int i,SduPtr *head,SduPtr *last);
void add(SduPtr *head,SduPtr *last);
void List(SduPtr head);
//以下的函数可否用函数指针来处理,请前辈指教
SduPtr chake(int data,int i,SduPtr head,SduPtr last);
SduPtr ck01(int data,SduPtr head,SduPtr last);
SduPtr ck02(int data,SduPtr head,SduPtr last);
SduPtr ck03(int data,SduPtr head,SduPtr last);
SduPtr ck04(int data,SduPtr head,SduPtr last);
SduPtr ck05(int data,SduPtr head,SduPtr last);

//以下函数有问题。
void del(SduPtr *head,SduPtr *last);

int main(int argc, char **argv)
{
    SduPtr head = NULL;    //头元素地址
    SduPtr last = NULL;    //最后元素地址
    int i = 0;    //流程控制码
    
    do {
//        printf("in main head = %p , last = %p\n",head,last);
        set(input(i),&head,&last);
        List(head);
    }while(1);
    
    return 0;
}

//输入增加、删除操作码
int input(int i){
    printf("1 is add , 2 is del , input your select : ");
    do {
        scanf("%d",&i);
    }while(i!=1 && i!=2);
    return i;
}

//接收操作码后的操作
void set(int i,SduPtr *head,SduPtr *last){
    switch (i){
        case 1:
            add(head,last);
            break;
        case 2:
            del(head,last);
            break;
        default:
            printf("select error !\n");
            break;
    }
}

//实现添加链表
void add(SduPtr *head,SduPtr *last){
    SduPtr p = (SduPtr)malloc(sizeof(Sdu));
    
    //申请失败则提示并返回
    if ( p == NULL){
        printf("malloc cache is NULL , error!\n");
        return;
    }
    
    //申请成功,录入新数据
    printf("input your mouber :");
    scanf("%d",&p->number);
    printf("input sex (0 man , 1 wuman):");
    scanf("%d",&p->sex);
    printf("input your age :");
    scanf("%d",&p->age);
    printf("input your class :");
    scanf("%d",&p->class);
    printf("input counter :");
    scanf("%d",&p->counter);
    
    //每次都从head重新计算last的地址
    *last = *head;
    
    //插入新数据p
    if (*head == NULL){    //表空的操作
        *head = p;
        *last = p;
        (*head)->next = NULL;
    }else{                    //表不为空的操作
        if ((*head)->next == NULL){    //表不空,但只有表头1个数据的操作
            (*head)->next = p;
            *last = p;
            (*last)->next = NULL;
        }else{
            do {                        //很多数据,则重新计算生成last的地址并链接新数据
                *last = (*last)->next;
            }while((*last)->next != NULL);
            (*last)->next = p;
            *last = p;
        }
    }
//    printf("in add head = %p , last = %p , p = %p\n",*head,*last,p);
}

//按选择的类型与其值来搜索删除数据
void del(SduPtr *head,SduPtr *last){
    SduPtr p , now1 , now2 ;
    int i , data;
    
    //数据为null返回
    if (*head == NULL){
        printf("link node is NULL, no data .\n");
        return ;
    }
    
    //否则操作录入要删除的资料
    printf("1 del number , 2 del sex , 3 del age , 4 del class ,5 del counter .\n");
    printf("input your del type num : ");
    scanf("%d",&i);
    printf("input your del data value : ");
    scanf("%d",&data);

    //检查是否存在要删除的数组,有则接收其指针p,无则NULL
    p = chake(data,i,*head,*last);
    
    //操作查询返回的结果p
    now1 = *head;
    now2 = *head;
    
    if (p == NULL){
        printf("no your find DATA , error !\n");
    }else{
        if(now1->next == NULL){
            *head = NULL;
        }else{
            do {
                now2 = now2->next;
                if (now2 == p){
                    now1->next = now2->next;
                    free(now2);
                    break;
                }
                now1 = now2;
            }while(now2->next != NULL);
        }
    }
}

SduPtr chake(int data,int i,SduPtr head,SduPtr last){
    SduPtr p;
    switch (i){
        case 1:
            p = ck01(data,head,last);
            break;
        case 2:
            p = ck02(data,head,last);
            break;
        case 3:
            p = ck03(data,head,last);
            break;
        case 4:
            p = ck04(data,head,last);
            break;
        case 5:
            p = ck05(data,head,last);
            break;
    }
    return p;
}

SduPtr ck01(int data,SduPtr head,SduPtr last){
    SduPtr i = head;
    do {
        if (i->number == data){
            break;
        }
        i = i->next;
    }while(i->next != NULL);
    if (i == last){
        i = NULL;
    }
    return i;
}

SduPtr ck02(int data,SduPtr head,SduPtr last){
    SduPtr i = head;
    do {
        if (i->sex == data){
            break;
        }
        i = i->next;
    }while(i->next != NULL);
    if (i == last){
        i = NULL;
    }
    return i;
}
SduPtr ck03(int data,SduPtr head,SduPtr last){
    SduPtr i = head;
    do {
        if (i->age == data){
            break;
        }
        i = i->next;
    }while(i->next != NULL);
    if (i == last){
        i = NULL;
    }
    return i;
}

SduPtr ck04(int data,SduPtr head,SduPtr last){
    SduPtr i = head;
    do {
        if (i->class == data){
            break;
        }
        i = i->next;
    }while(i->next != NULL);
    if (i == last){
        i = NULL;
    }
    return i;
}

SduPtr ck05(int data,SduPtr head,SduPtr last){
    SduPtr i = head;
    do {
        if (i->counter == data){
            break;
        }
        i = i->next;
    }while(i->next != NULL);
    if (i == last){
        i = NULL;
    }
    return i;
}

void List(SduPtr head){
    SduPtr i = head;
    if (i == NULL){
        printf("now is NULL\n");
    }else{
        do{
            printf("data ptr = %p , ",i);
            printf(
            "number %d,sex %d,age %d,class %d,counter %d.\n",
            i->number,i->sex,i->age,i->class,i->counter);
            i = i->next;
            printf("\n");
        }while(i != NULL);
    }
}

搜索更多相关主题的帖子: color 
2017-01-17 00:42
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
本人新手,今晚看了学生系统的贴,想试试制作,结果弄到了深夜。
del函数是有问题的,不过太晚不修了,望有兴趣的请连同建议或优化方案一并回复。

还有发代码的目的就是因为在以下部分及其以下的代码感觉很重复,可否用函数指针来优化代替?
p = chake(data,i,*head,*last);  //检查是否存在要删除的数组,有则接收其指针p,无则NULL

望高手指点,并提出意见。谢谢!
2017-01-17 01:01
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
统一回复:
3楼:
下午我尝试使用2楼建议的方法去试试。

4楼:
学习内容要求先学单向链表,所以就先耗着了。。。
至于函数类型的二维指针,有否更详细的例子代码或直接更新本代码给本人作为学习与参考 ,先谢!

5楼:
方法可行,我还没想到有这个方法,学习了,谢谢。
不过感觉还是治标不治本,对于编译器来说其实编码其实一样,目前函数类型的二维指针是最合适的,可惜本人没多用过,现在学。

最后:
纠结在使用函数类型的二维指针上,是因为这程序就是学习使用之一,但本人又对函数类型的二维指针应该到本程序的结构体里要如何实现毫无经验,因此求助,求得前辈们的宝贵经验成果而学之。最后再次谢谢大家的建议。
2017-01-17 11:27
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 8楼 xzlxzlxzl
对啊 ,我写得太长了,也很不简洁,最后结构体里的元素后期才发现单独应用很麻烦(选择类型删除哪里就开始抓狂了)。

所以我想看看 成熟的做法是如何实现的,以及代码风格是怎么样的,用以学习。
重申本人新手,敢于发代码并不因为认为了得,而是想勾起前辈们的兴趣,从而发出更好更漂亮的代码,好让本小白学习。谢谢!
2017-01-18 10:30
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 7楼 九转星河
谢谢,学习&消化ing
2017-01-18 10:35
快速回复:前辈帮忙指导,里面的程序有些问题想请教
数据加载中...
 
   



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

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