| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1010 人关注过本帖
标题:求在线大神一数据结构的题
只看楼主 加入收藏
lxmaint
Rank: 2
等 级:论坛游民
威 望:1
帖 子:20
专家分:74
注 册:2015-3-15
收藏
得分:4 
以下是引用TonyDeng在2015-3-24 20:16:12的发言:

我上面說了,你第2行的#define就錯,而且是語法錯,那是很基本的,這都錯,數據結構也弄不來。飯要一口一口喫,題目也說了,逐個功能完成,根據邏輯,第一件要做的事,是寫出一個輸入單條學生數據的函數。你寫這個吧,完了再接著做,別想在短時間内一次完成。很多所謂的“新手”求教,踢都不會動,坐等別人給全部做好,那乾脆別學了。
呵呵,你讲的也对,
不过我还是能理解他的心情的,第一次接触,毫无头绪,又被赶着做题,东看西看又感觉自相矛盾,呵呵
2015-03-24 20:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這種題目,老師也不會要求一天內完成。

授人以渔,不授人以鱼。
2015-03-24 20:49
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
回复 12楼 TonyDeng
如果是我们的老师,至少有半个月的时间做

一片落叶掉进了回忆的流年。
2015-03-24 21:34
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:4 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZEND (sizeof(ND))
#define MALLOC(p) if(!(p = malloc(SIZEND))) exit(EXIT_FAILURE)
#define FREE(p) if(p) free(p) p = NULL
#define N 3

typedef struct node {
    int id;
    char name[40];
    int sco;
    struct node *next;
} ND, *PN;

void init_data(PN);
int cmp(PN a, PN b);
PN insert(PN);
PN search(PN, char*);
void swap(PN, PN);
void sort(PN);
PN update(PN, char*, int);
PN delete(PN, int);
void prt_ND(PN);
void prt_list(PN);
void free_list(PN);

int main(void) {
    int i = -1, id, newsco;
    PN head = NULL, cur = NULL;
    char t[40] = {0};

    puts("开始创建表:");

    while(++i < N) {
        if(!head) {
            MALLOC(head);
            head->next = NULL;

        } else head = insert(head);

        init_data(head);
    }

    puts("输出原始数据:");
    prt_list(head);

    sort(head);
    puts("输出排序后的数据:");
    prt_list(head);

    puts("输入要查找的姓名:");
    gets(t);
    cur = search(head, t);
    puts("输出要查找的数据:");
    prt_ND(cur);

    puts("输入要更新数据的姓名:");
    gets(t);
    puts("输入要改变的分数:");
    scanf("%d", &newsco);
    fflush(stdin);
    cur = update(head, t, newsco);
    puts("输出更新后的数据:");
    prt_ND(cur);

    puts("输入要删除节点的ID:");
    scanf("%d", &id);
    fflush(stdin);
    head = delete(head, id);
    puts("输出删除后的数据:");
    prt_list(head);

    free_list(head);
    return 0;
}

int cmp(PN a, PN b) {
    return a->sco - b->sco;
}

void init_data(PN p) {
    scanf("%d%s%d", &(p->id), p->name, &(p->sco));
    fflush(stdin);
}

PN insert(PN p) {
    PN new = NULL;
    MALLOC(new);
    new->next = p;
    p = new;
    return p;
}

PN search(PN head, char* s) {
    PN p = NULL;

    if(head != NULL) {
        for(p = head; p != NULL; p = p->next) {
            if(!strcmp(p->name, s)) break;
        }
    }

    return p;
}

void swap(PN p, PN q) {
    int tmpid, tmpsco;
    char tmpname[40];
    tmpid = p->id;
    tmpsco = p->sco;
    strcpy(tmpname, p->name);
    p->id = q->id;
    p->sco = q->sco;
    strcpy(p->name, q->name);
    q->id = tmpid;
    q->sco = tmpsco;
    strcpy(q->name, tmpname);
}

void sort(PN head) {
    PN p = NULL, q = NULL;

    if(head != NULL) {
        for(p = head; p != NULL; p = p->next) {
            for(q = p->next; q != NULL; q = q->next) {
                if(cmp(p, q) < 0) {
                    swap(p, q);
                }
            }
        }
    }
}

PN update(PN head, char* s, int newsco) {
    PN p = NULL;

    if(head != NULL) {
        for(p = head; p != NULL; p = p->next) {
            if(!strcmp(p->name, s)) {
                p->sco = newsco;
                break;
            }
        }
    }

    return p;
}

PN delete(PN head, int n) {
    PN cur, prev;

    for(cur = head, prev = NULL;
            cur != NULL && cur->id != n;
            prev = cur, cur = cur->next);

    if(!cur) {
        puts("没有找到要删除的数据");
        return head;
    }

    if(!prev) {
        puts("首节点被删除");
        head = head->next;

    } else {
        puts("一个有效节点被删除");
        prev->next = cur->next;
    }

    free(cur);
    return head;
}

void prt_ND(PN p) {
    if(!p) {
        printf("没有数据可供输出\n");
        return;
    }

    printf("%d\t%s\t%d\n", p->id, p->name, p->sco);
}

void prt_list(PN head) {
    PN p = head;

    while(p != NULL) {
        prt_ND(p);
        p = p->next;
    }
}

void free_list(PN head) {
    PN p;

    while(head != NULL) {
        p = head->next;
        free(head);
        head = p;
    }
}

Only the Code Tells the Truth             K.I.S.S
2015-03-24 23:19
longwu9t
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:732
专家分:2468
注 册:2014-10-9
收藏
得分:0 
写了近两个小时, 真心有点累

实在懒得写菜单了

楼主自己看着办吧

[ 本帖最后由 longwu9t 于 2015-3-24 23:22 编辑 ]

Only the Code Tells the Truth             K.I.S.S
2015-03-24 23:20
瑶瑶猪猪
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-3-24
收藏
得分:0 
回复 10楼 TonyDeng
- -我现学了,改完了...可还是有错啊...运行不出来


#include<stdio.h>
#define MAXSIZE 100
typedef struct student
{
    int num;
    char name[64];
    float score;
    int data[MAXSIZE];
    struct student *Next;
}student,*Pstudent;
typedef struct seqlist
{
 
    int length;
    int data[MAXSIZE];
}seqlist,*PSeqList;
PSeqList Init_SeqList( )
{
    PSeqList PL;
    PL=(PSeqList)malloc(sizeof(SeqList));
    if (PL)
    PL->length=0;
    return (PL);
}
void Destroy_SeqList(PSeqList *PL)
{
if (*PL)
free (*PL) ;

*PL=NULL;
return ;
}
int Length_SeqList(PSeqList PL)
{
if (PL)
return (PL->length) ;

return (-1);
}
int Location_SeqList (PSeqList PL, int x)
{
int i=0;
if (!PL)
{
printf("不存在,不能检查");
return(-1);
}

while (i<PL->length&& PL->data[i]!= x)
i++;

if (i>=PL->length)
return 0;
else
return (i+1);
}
int Insert_SeqList(PSeqList PL,int i,int x)
{
int j;
if (!PL)
{
printf("表不存在");
return (-2);
}  

if (PL->length>= MAXSIZE)
{
printf("空间已满");
return(-1);
}  
if(i<1 || i>PL->length+1)
{
printf("插入位置不合法");
return (0);
}

for(j= PL->length-1;j>=i-1;j--)
PL->data[j+1]= PL->data[j];

PL->data[i-1]=x;
PL->length++;
return (1);
}
int Delete_SeqList(PSeqList PL,int i)
{
int j;
if (!PL)
{
printf("不存在,不能删除元素");
return(-1);
}
if(i<1 || i> PL->length)
{
printf("删除位置不合法");
return(0);
}
for(j=i; j<PL->length; j++)
PL->data[j-1]= PL->data[j];
PL->length--;
return (1);
}
 
void Print_Choice()
{
printf("请输入你要进行的操作:\n");
printf("1.插入信息\n");
printf("2.删除信息:\n");
printf("3.查找信息:\n");
printf("4.更改信息:\n");
printf("5.退出:\n");
return;
}
void Print_SeqList(PSeqList PL)
{
printf("\图表如下:");

int i=0;
for(i=0;i<PL->length;i++)
{
printf("学生学号:%d\n学生姓名:%s\n学生成绩:%f\n",PL->student[i].num,PL->student[i].name,PL->student[i].score);
}

printf("\n");
}
void Insert(PSeqList PL)
{
int i;
int num;
char name[20];
float score;
printf("请输入要插入的位置:\n");
scanf("%d",&i);
printf("请输入学生的学号:\n");
scanf("%d",&num);
printf("请输入学生的姓名:\n");
scanf("%s",&name);
printf("请输入学生的成绩:\n");
scanf("%f",&score);
}

Insert_SeqList(PL,i,x);
Print_SeqList(PL);
}
void Delete(PSeqList PL)
{
int i;
printf("请输入删除的位置:");
scanf("%d",&i);

Delete_SeqList(PL,i);
Print_SeqList(PL);
}

void Locate(PSeqList PL)
{
int Locate(pl);
printf("请输入想查找的学生信息:");
datatype x;
scanf("%d",&x);

int i=Location_SeqList(PL,x);
if(i>0)
{
printf("该学生在%d中",i);
printf("请输入你要查找的学生信息:\n学生学号:%d\n学生姓名:%s\n学生成绩:%f\n",PL->student[i].num,PL->student[i].name,PL->student[i].score)
}
else if(i==0)
printf("未查到");
else("erro")
Print_SeqList(PL);
}

int Renew(PseqList PL)
{
    int x,choice,num,score;
    char name[20];
    printf("请输入想更改的学生信息:");
    scanf("%d",&x);
    int i=Location_SeqList(PL,x);
    if(i>0)
    printf("请输入你要更改的学生信息:\n学生学号:%d\n学生姓名:%s\n学生成绩:%f\n",PL->student[i].num,PL->student[i].name,PL->student[i].score)
    printf("请选择更改项目");
    printf("更改学号");
    printf("更改名字");
    printf("更改成绩");
    printf("返回");
   
    scanf("%d",&choice);
while(1)
{
    switch(choice)
    {
        case 1:
        printf("请输入新的学号:\n");
        scanf("%d",&num);
        PL->student[i-1].num=num;
        return 0;
        case 2:
        printf("请输入新的姓名:\n");
        scanf("%s",name);
        strcpy(PL->student[i-1].name=name);
        return 0;
        case 3:
        printf("请输入新的成绩:\n");
        scanf("%f",&score);
        PL->student[i-1].score=score;
        case 4:
        return 0;
        default:
        printf("输入错误,请重新输入");
        break;
        
    }
    }
}


int main()
{
    PseqList student=Init_SeqList();
    int choice;
   
    while(1)
    {
        Print_SeqList(student);
        Print_Choice();
        scanf("%d",&choice);
        
        switch(choice)
        {
            case 1:
            Insert(student);
            break;
            case 2:
            Delete(student);
            break;
            case 3:
            Locate(student);
            break;
            case 4:
            Renew(student);
            break;
            case 5:
            Destroy_SeqList(&student);
            return 0;
            default:
            printf("输入错误,请重新输入");
            break
        }
    }
}   
   

2015-03-24 23:28
瑶瑶猪猪
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2015-3-24
收藏
得分:0 
回复 15楼 longwu9t
谢谢....这个估计以后才能看懂
2015-03-24 23:34
快速回复:求在线大神一数据结构的题
数据加载中...
 
   



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

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