标题:新手在用链表输出学生信息时遇到的问题,求助大家!
只看楼主
铃铛侠
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-9-4
结帖率:66.67%
已结贴  问题点数:5 回复次数:3 
新手在用链表输出学生信息时遇到的问题,求助大家!
我在输出学生信息的时候发现,只有最后一排数据元素输出了,前面的都是乱码,真的不知道是怎么回事...希望路过的大神能教教我
还有那个insert function好像也有问题,能帮我看看吗?谢谢啦
程序代码:
#include<stdio.h>
#include<string.h>
#define ERROR 0
#define OK 1



typedef struct Student
{
    char no[4];
    char name[8];
    int price;
}Student;

typedef struct Lnode
{
    Student data;
    struct Lnode *next;
}Lnode, *LinkList;

int i, j;



int InitList(LinkList * addr_L)
{  *addr_L=(LinkList)malloc(sizeof(Lnode));
   if (!(*addr_L))  return -2;
   (*addr_L)->next= NULL;
   return OK;
}


int CreateList(LinkList *L,Student e,int n)//创建链表
{
        
    LinkList p;
    *L = (LinkList)malloc(sizeof(Lnode));
    (*L)->next = NULL;
    Lnode *r;
    r = L;

    for (j = 0; j<n; j++)
    {
        p = (LinkList)malloc(sizeof(Lnode));
        scanf("%s %s %d",p->data.no,p->data.name,&p->data.price);
          e = p->data;
        p->next = NULL;
        r->next = p;
    
    }
    return OK;
}


/*void OutList(LinkList L,int n)//逐个显示表中的元素
{
    Lnode *p;
    p=L;
    j=0;
    while(p&&j<n)
    {
        printf("%s %s %d\n",p->data.no,p->data.name,p->data.price);
        p=p->next;
        ++j;
    }
  return OK;
}*/

void DisplayElem(LinkList L)//逐个显示表中的元素
{
    Lnode *p=L;
    while (p!=NULL)
    {
        printf("%s %s %d\n", p->data.no, p->data.name, p->data.price);
        p = p->next;
    }
    return 0;
}



int Insert()
{
    LinkList L;
    LinkList p,pre;//
    p=L;
    LinkList s;
    s=(LinkList)malloc(sizeof(struct Lnode));
    struct Student NewElement;
    printf("请输入学生学号,姓名,成绩:");
    scanf("%s %s %d", NewElement.no,NewElement.name,&NewElement.price);
    s->data=NewElement;
    s->next=NULL;

    if(L->data.no==-1)
    {
        L->data=NewElement;
        return 0;
    }
    int i;
    for (i = 0; p!=NULL; i++) {
        if (p->data.no > s->data.no)
            break;
        pre=p;
        p=p->next;

    }
    if(p==L)
    {
        s->next=L;
        L=s;
    }
    else if(p==NULL)
    {
        pre->next=s;
    }
    else
    {
        pre->next=s;
        s->next=p;
    }
    return 0;
}

int main()
{
    int choice,k,i;
    Student e;
    LinkList L;


     printf("\n********************************\n\n");  
     puts("1. 构造顺序表并录入学生信息");    
     puts("2. 显示学生信息");  
     puts("3. 插入学生信息");
     puts("0. 退出");
     printf("\n********************************\n\n");  
     
    
    while(1)  
    {   
        
        puts("请选择:");  
        scanf("%d",&choice);  
        if(choice==0)  
         break;  
        switch(choice)  
        {  
            case 1:  
                    if (InitList(&L))
                         printf("初始化链表成功\n");
                     else
                         printf("初始化链表失败\n");
                    printf("请输入学生个数:\n");
                      scanf("%d", &k);
                    printf("请输入学生信息:学号 姓名 成绩\n");
                    if (CreateList(L,e,k))
                    printf("创建成功\n");
                    else
                     printf("创建失败\n");
                    break;  
            case 2:  
                   printf("输出每个同学的成绩:\n");
                   DisplayElem(L);
                     break;  
            case 3:
                   if (Insert(L))
                     printf("插入成功\n");
                   else
                   printf("插入失败\n");
            break;
       } 
      } 
               printf("\n\n谢谢您的使用,请按任意键退出\n\n\n");  
               system("pause");  
               return 0;  

    return 0;
}




测试图如下:



搜索更多相关主题的帖子: function insert 信息 元素 
2017-04-08 00:34
铃铛侠
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-9-4
得分:0 
插入学生信息是插入一个信息到有序表中使输出仍然有序,如向1,2,6,8中插入5,输出1,2,5,6,8。
2017-04-08 13:46
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
得分:5 
程序代码:
#include<stdio.h>
#include<stdlib.h>

#include<string.h>
#define ERROR 0
#define OK 1



typedef struct Student {
    char no[4];
    char name[8];
    int price;
} Student;

typedef struct Lnode {
    Student data;
    struct Lnode *next;
} Lnode, *LinkList;

int i, j;

int InitList(LinkList * addr_L) {
    *addr_L=(LinkList)malloc(sizeof(Lnode));
    if (!(*addr_L))  return -2;/*return-2和return 1 都是非零,转换成布尔值都是true。*/
    (*addr_L)->next= NULL;
    return OK;
}

int CreateList(LinkList *L,Student e,int n) { //创建链表

    LinkList p;
    *L = (LinkList)malloc(sizeof(Lnode));
    (*L)->next = NULL;
    Lnode *r; 

    r = *L;/*"*L"是结构体指针的指针,r是结构体指针。玩指针一定要时刻清楚每一个变量每一时刻的具体含义*/

    for (j = 0; j<n; j++) {
        p = (LinkList)malloc(sizeof(Lnode));
        scanf("%s %s %d",p->data.no,p->data.name,&p->data.price);
        e = p->data;
        p->next = NULL;
        r->next = p;
        r=p;/*循环要动起来,变量r从头到尾不迭代你怎么保存数据生成链表?*/

    }
    return OK;
}

/*void OutList(LinkList L,int n)//逐个显示表中的元素
{
    Lnode *p;
    p=L;
    j=0;
    while(p&&j<n)
    {
        printf("%s %s %d\n",p->data.no,p->data.name,p->data.price);
        p=p->next;
        ++j;
    }
  return OK;
}*/

void DisplayElem(LinkList L) { //逐个显示表中的元素
    Lnode *p=L;
    while (p!=NULL) {
        printf("%s %s %d\n", p->data.no, p->data.name, p->data.price);
        p = p->next;
    }
//    return 0;  /*void函数也能有返回值?*/

}



int Insert() {
    LinkList L;/*这里的L是个局部变量,和函数外部的L没有半毛钱关系。且这个L由于尚未初始化他的值是随机的*/
    LinkList p,pre;//
    p=L;
    LinkList s;
    s=(LinkList)malloc(sizeof(struct Lnode));
    struct Student NewElement;
    printf("请输入学生学号,姓名,成绩:");
    scanf("%s %s %d", NewElement.no,NewElement.name,&NewElement.price);
    s->data=NewElement;
    s->next=NULL;

    if(L->data.no==-1) {/*data.no是个char数组,,和“-1”判断是否相等是什么逻辑?*/
        L->data=NewElement;
        return 0;
    }
    int i;
    for (i = 0; p!=NULL; i++) {
        if (p->data.no > s->data.no)
            break;
        pre=p;
        p=p->next;

    }
    if(p==L) {
        s->next=L;
        L=s;
    } else if(p==NULL) {
        pre->next=s;
    } else {
        pre->next=s;
        s->next=p;
    }
    return 0;
}

int main() {
    int choice,k,i;
    Student e;
    LinkList L;

    printf("\n********************************\n\n");
    puts("1. 构造顺序表并录入学生信息");
    puts("2. 显示学生信息");
    puts("3. 插入学生信息");
    puts("0. 退出");
    printf("\n********************************\n\n");

    while(1) {

        puts("请选择:");
        scanf("%d",&choice);
        if(choice==0)
            break;
        switch(choice) {
            case 1:
                if (InitList(&L))
                    printf("初始化链表成功\n");
                else
                    printf("初始化链表失败\n");
                printf("请输入学生个数:\n");
                scanf("%d", &k);
                printf("请输入学生信息:学号 姓名 成绩\n");
                if (CreateList(&L,e,k))/*“L”和“&L”的区别楼主清楚否?C语言函数只传值*/
                    printf("创建成功\n");
                else
                    printf("创建失败\n");
                break;
            case 2:
                printf("输出每个同学的成绩:\n");
                DisplayElem(L);
                break;
            case 3:
                if (Insert(L))
                    printf("插入成功\n");
                else
                    printf("插入失败\n");
                break;
        }
    }
    printf("\n\n谢谢您的使用,请按任意键退出\n\n\n");
    system("pause");
    return 0;

    return 0;
}

问题比较多比较杂,不好纠正。   我时间不太充分,就零零散散抓几个错误说说




φ(゜▽゜*)♪
2017-04-09 23:52
铃铛侠
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-9-4
得分:0 
谢谢!没想到有这么多错误,我还是要好好学习c语言...
2017-04-17 18:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475883-1-1.html




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

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