pubg.... 发表于 2021-9-3 13:06:48

节点如何串起来成为链表

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

#define MaxName 5
#define MaxC 20
typedef struct ListNode *List;
struct ListNode{
    char Name;//学生姓名
    List Next;//指针域
};//链表节点
struct StudentNode{
    char Name;//学生姓名
    int nC;//该生选课门数
    int C;//该学生选择的课程编号
} *Student;//输入的学生信息
struct CourseNode{
    int Counter;//该课程的选课人数
    List Ptr;//链表头指针
} *Course;//课程链表的表头

int CmpName(const void *a, const void *b){//调用qsort对学生姓名按字典序排序时用到的比较函数
    return strcmp(((const struct StudentNode*)a)->Name, ((const struct StudentNode*)b)->Name);
}
void Read_and_Sort(int *N, int *K);//读入并存储输入数据,再按学生姓名排序
List NewNode(char *name);//建立链表节点
void InsertCourse(int N, int K);//按姓名倒序,将学生的选课记录插入相应链表
void Output(int K);//对K门课,输出选课学生名单

int main()
{
    int N, K;
    Read_and_Sort(&N, &K);//读入并存储输入数据,再按学生姓名排序
    InsertCourse(N, K);//按姓名倒序,将学生的选课记录插入相应链表
    Output(K);//对K门课,输出选课学生名单
    return 0;
}

void Read_and_Sort(int *N, int *K){
    scanf("%d%d\n",N, K);
    Student = malloc(sizeof(struct StudentNode)*(*N));//学生记录
    Course = malloc(sizeof(struct CourseNode)*(*K));//课程链表表头
    for(int i=0;i<(*K);i++){//初始化课程链表表头
      Course.Counter = 0;
      Course.Ptr = NULL;
    }
    for(int i=0;i<(*N);i++){//读入并存储数据
      scanf("%s %d",Student.Name, &Student.nC);
      for(int j=0;j<Student.nC;j++)
            scanf("%d",&Student.C);
    }
    qsort(Student, (*N), sizeof(struct StudentNode), CmpName);//按学生姓名排序
}

List NewNode(char *name){
    List temp;
    temp = (List)malloc(sizeof(struct ListNode));
    strcpy(temp->Name, name);
    temp->Next = NULL;
    return temp;
}

void InsertCourse(int N, int K){
    List Node;
    int CourseIndex;//暂存选课编号
    for(int i=N-1;i>=0;i--)//按姓名倒序//倒着插在表头,最后插入的表头一定是字典序最前面的
      for(int j=Student.nC-1;j>=0;j--){//对该生选的每门课
            CourseIndex = Student.C - 1;//记录课程编号
            Node = NewNode(Student.Name);//建立新节点
            Node->Next = Course.Ptr;//插入链表表头
            Course.Ptr = Node;
            Course.Counter++;
      }
}

void Output(int K){
    List Ptr;
    for(int i=0;i<K;i++){
      printf("%d %d\n",i+1, Course.Counter);
      for(Ptr=Course.Ptr;Ptr;Ptr=Ptr->Next)
            printf("%s\n",Ptr->Name);
    }
}

lei1996 发表于 2021-9-3 23:10:50

这代码不是挺完整的吗
节点串起来成链表主要在void InsertCourse(int N, int K)里
每个Course里都有一个链表来存储选这门课的人,头节点就是ptr

pubg.... 发表于 2021-9-3 23:19:37

lei1996 发表于 2021-9-3 23:10
这代码不是挺完整的吗
节点串起来成链表主要在void InsertCourse(int N, int K)里
每个Course里都有一个 ...

我是一个小白,有代码都看不懂的那种

lei1996 发表于 2021-9-3 23:26:12

慢慢看慢慢学吧   {:10_256:}
页: [1]
查看完整版本: 节点如何串起来成为链表