鱼C论坛

 找回密码
 立即注册
查看: 2106|回复: 2

求助,我的这个链表是哪里出错了

[复制链接]
发表于 2021-1-3 15:41:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在调用prin函数的时候输出不出来东西
#include <stdio.h>
#include <string.h>
#include<malloc.h>
#include <stdlib.h>  //用于system语句的声明
typedef struct subjects        //定义结构体叫作SUB,在后面就可以直接使用
{
         int num;                 //课程编号
         char name[30];           //课程名称
         char kind[20];           //课程性质
         int stime;               //总学时
         int ttime;               //授课学时
         int etime;               //实验或上机学时
         int score;               //学分
         int term;                //开课学期
         struct subjects *next;
}SUB;              

SUB *head=NULL;

SUB *create_form()          //创建链表
{
         SUB *head,*tail,*p;
         int num,stime,ttime;
         int etime,score,term;
         char name[20],kind[10];
         int size=sizeof(SUB);
         head=tail=NULL;
         printf("输入选修课程信息:\n");
         scanf("%d%s%s%d%d%d%d%d",&num,name,kind,&stime,&ttime,&etime,&score,&term);
        while(num!=0)
        {
                  p=(SUB *)malloc(size);
                  p->num=num;
                  strcpy(p->name,name);
                  strcpy(p->kind,kind);
                  p->stime=stime;
                  p->ttime=ttime;
                  p->etime=etime;
                  p->score=score;
                  p->term=term;
                 if(head==NULL)
                         head=p;
                 else
                         tail->next=p;
                 tail=p;
                 scanf("%d%s%s%d%d%d%d%d",&num,name,kind,&stime,&ttime,&etime,&score,&term);
         }
         tail->next=NULL;
         return head;
}

void prin()   //浏览所有课程
{
        void readfile();
        SUB *ptr;
        head=NULL;
        readfile();
        if(head==NULL)
        {
                printf("\n\n\t*********NO RECORDS!************\n");
                return;
        }
        printf("课程编号  课程名称  课程性质  总学时  授课学时  实践或上机学时  学分  开课学期\n");
        for(ptr=head;ptr;ptr=ptr->next)
                {
                        printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
                }
        system("pause");
}

void *myInsert(SUB *subj)  //链表插入操作  
{
         SUB *ptr,*ptr2;
         ptr=subj;
                if(head==NULL)
                {
                        head=ptr;
                        head->next=NULL;
                }
                else
                {
                        for(ptr2=head;ptr2;ptr2=ptr2->next)
                                if(ptr2->next==NULL)
                                {
                                        ptr2->next=subj;
                                        subj->next=NULL;
                                        break;
                                }
                }
                return head;
}

void *insert()//插入课程信息
{
         SUB *ptr,*subj;     //定义结构体指针指向这个结构体SUB
         int size=sizeof(SUB);
         char ch,ch1;
         while(ch!='0')
                {
                          subj=(SUB *)malloc(size); //(分配类型 *)malloc(分配元素个数 *sizeof(分配类型))如果成功,则返回该空间首地址,该空间没有初始化,如果失败,则返回0
                          ptr=subj;
                          printf("输入要插入的课程信息:\n");
                          printf("\n\t\t请输入课程编号:");scanf("%d",&subj->num);   
                          printf("\n\t\t请输入课程名称:");scanf("%s",&subj->name);  
                          printf("\n\t\t请输入课程性质:");scanf("%s",&subj->kind);  
                          printf("\n\t\t请输入总学时:");scanf("%d",&subj->stime);
                          printf("\n\t\t请输入授课学时:");scanf("%d",&subj->ttime);
                          printf("\n\t\t请输入实践或上机学时:");scanf("%d",&subj->etime);
                          printf("\n\t\t请输入学分:");scanf("%d",&subj->score);
                          printf("\n\t\t请输入开课学期:");scanf("%d",&subj->term);
                          myInsert(subj);
                        printf("\n添加完毕,新信息存入文件中\n");
                        printf("\n继续插入请按回车\n");
                        printf("\n结束添加课程按 0: [ ]\b\b");
                        ch1=getchar();                      //将回车键赋给CH1,否则subj->term输完后输入的回车键会赋给CH,因此用CH1填补。
                        ch=getchar();
                }
         return head;
}

void savefile()         //保存课程文件
{
         SUB *p;
         FILE *fp;
         fp=fopen("3.txt","w");
         if(fp==NULL)exit(0);
         printf("课程编号  课程名称  课程性质  总学时  授课学时  实验或上机学时  学分  开课学期\n");
         for(p=head;p;p=p->next)
                fprintf(fp,"%5d%12s%9s%9d%9d%11d%11d%7d\n",p->num,p->name,p->kind,p->stime,p->ttime,p->etime,p->score,p->term);
         fclose(fp);
         printf("创建后的信息已放入'3.txt'文件中\n");
         system("pause");
}


void readfile()                    //阅读文件
{
        FILE *fp;     //声明fp是指针,用来指向FILE类型的对象,fp是指向文件结构体的指针变
        fp=fopen("E:\\DOCUMENT\\VC++\\hw\\3.txt","r");
    fclose(fp);
}

void search()          //课程信息查询
{
   int a,num;
   int t=1;
   char type[10],min[10];
   SUB *ptr;
    L1:system("cls");
   printf("\n\n\t\t**********请选择查询方式*************\n");
   printf("\n\t\t\t1---按课程名称查找\n");
   printf("\n\t\t\t2---按课程性质查找\n");
   printf("\n\t\t\t3---按学分查找\n");
   printf("\n\t\t\t4---退出查找\n");
   printf("\n\n\t\t**************************************\n");
   printf("\n\nChiose your number(1-4):[ ]\b\b");
   scanf("%d",&a);
   switch(a)
   {
                case 1:printf("请输入要查找的课程的名称:");
                        scanf("%s",min);
                        printf("课程编号  课程名称  课程性质  总学时  授课学时  实践或上机学时  学分  开课学期\n");
                        for(ptr=head;ptr;ptr=ptr->next)
                                if(strcmp(min,ptr->name)==0)
                                {
                                 printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
                                 t=0;
                                }
                        if(t)
                                printf("\t\n未找到!\n");
                        t=1;
                        system("pause");
                        goto L1;
                               
           case 2:printf("请输入要查找的课程的性质:");
                   scanf("%s",type);
                   printf("课程编号  课程名称  课程性质  总学时  授课学时  实践或上机学时  学分  开课学期\n");
                   for(ptr=head;ptr;ptr=ptr->next)
                           if(strcmp(type,ptr->kind)==0)   //strcmp为比较字符串
                                {
                                         printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
                                         t=0;
                                }
                        if(t)
                                printf("\t\n未找到!\n");
                        t=1;
                        system("pause");
                        goto L1;     //直接跳转到L1执行下面的语句
  
          case 3:printf("输入要查找的课程的学分:");
                   scanf("%d",&num);
                   printf("课程编号  课程名称  课程性质  总学时  授课学时  实践或上机学时  学分  开课学期\n");
                   for(ptr=head;ptr;ptr=ptr->next)
                           if(ptr->score==num)
                                {
                                         printf("%5d%12s%9s%9d%9d%11d%11d%7d\n",ptr->num,ptr->name,ptr->kind,ptr->stime,ptr->ttime,ptr->etime,ptr->score,ptr->term);
                                         t=0;
                                }
                        if(t)
                                printf("\n\t未找到!\n");
                        t=1;
                        system("pause");  //暂停
                        goto L1;
                       
                case 4:break;
        }
}



void Students()    //学生菜单
{
        int n,w=1;
   do
    {
                system("cls");   //清屏;清除上一个回车的内容
            puts("\n\n\t\t*********************学生菜单***********************\n\n");
        puts("\t\t\t\t1---浏览所有课程\n");
                puts("\t\t\t\t2---查询课程信息\n");
                puts("\t\t\t\t3---返回主菜单");
        puts("\n\n\t\t****************************************************\n");
        printf("Chiose your number(1-6):[ ]\b\b");
        scanf("%d",&n);
        switch(n)
        {
               case 1:prin();break;
                  case 2:search();break;
                  case 3:return;
                  default:;
        }
      }
      while(w==1);
}
int  main()
{
        int n,w=1;
        do
    {
                system("cls");
                puts("\n\n\t\t*********************MENU***********************\n\n");
        puts("\t\t\t\t1.以学生身份登录\n");
                puts("\t\t\t\t2.添加课程\n");
                puts("\t\t\t\t3.退出");
   puts("\n\n\t\t************************************************\n");
        printf("Chiose your number(1-3):[ ]\b\b");
        scanf("%d",&n);
                switch(n)
                {
                case 1:Students();break;  //case为语句1
                case 2:insert();savefile();break;
                case 3:w=0;break;
                default:;   //语句n+1
                }
    }

    while(w==1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-4 09:19:04 | 显示全部楼层
创建链表没有给指针分配内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-4 10:48:46 | 显示全部楼层
你创建链表的时候没有动态分配内存  可以用malloc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表