JCBourne 发表于 2021-1-3 15:41:13

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

在调用prin函数的时候输出不出来东西
#include <stdio.h>
#include <string.h>
#include<malloc.h>
#include <stdlib.h>//用于system语句的声明
typedef struct subjects      //定义结构体叫作SUB,在后面就可以直接使用
{
       int num;               //课程编号
       char name;         //课程名称
       char kind;         //课程性质
       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,kind;
       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,min;
   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);
}
intmain()
{
        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;
}

chxchxkkk 发表于 2021-1-4 09:19:04

创建链表没有给指针分配内存

现实老年人 发表于 2021-1-4 10:48:46

你创建链表的时候没有动态分配内存可以用malloc
页: [1]
查看完整版本: 求助,我的这个链表是哪里出错了