折磨了我 N 次的 单链表

Posted wkx2000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了折磨了我 N 次的 单链表相关的知识,希望对你有一定的参考价值。

最近 ?? 有点不在学习上呀

自我检讨一下

发我这几天 多写代码

从刚刚开始接触 单链表,其实我觉得我是懂得

无论是插入 还是删除 什么的

但是,最近

直到遇见老师所发配下的任务 单链表的应用

我就很 懵逼

指针老是出错误呀

所以

这无时无刻 在提醒我们要把 指针学好

接下来,我要把题目亮出来(真是磨人的小妖精)

根据用户输入的学生人数及每个 学生姓名和成绩建立一个单链表(带头结点),并按学生成绩递减排序,然后按名次输出所有学生姓名和成绩。(重在排序)

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 typedef struct node{
  5     char name[10];
  6     int score;
  7     struct node *next;
  8 }stulist;
  9 
 10 initstulist(stulist* head){
 11     head->next==NULL; 
 12     return head;
 13 }
 14 
 15 void inputstulist(stulist* head,int n){
 16     initstulist(head);
 17     stulist*q=head;
 18     int i;
 19     for(i=0;i<n;i++){
 20         stulist*p=(stulist*)malloc(sizeof(stulist));
 21         printf("姓名:");
 22         scanf (" %s",p->name);
 23         printf("分数:");
 24         scanf("%d",&p->score); 
 25         p->next=q->next;
 26         q->next=p; 
 27         printf("\n");
 28     }
 29     return;
 30 }
 31 
 32 void delstulist(stulist* head){
 33     stulist *p,*q;
 34     p=head;
 35     while(p){
 36         q=p->next;
 37         free(q);
 38         p=q;
 39     }
 40 
 41 }
 42 
 43 void sortstulist(stulist* head,int n){
 44     stulist *p=head->next;
 45     stulist *q;
 46     int i,j,t;
 47     char na[10];
 48     for(i=0;i<n;i++){
 49         q=p->next;
 50         for(j=0;j<n-i-1;j++){
 51             if(p->score < q->score){
 52                 t=p->score;
 53                 p->score=q->score;
 54                 q->score=t;
 55                 
 56                         strcpy(na,p->name);
 57                                 strcpy(p->name,q->name);
 58                                 strcpy(q->name,na);
 59                             }
 60                             q=q->next;
 61                             }
 62                                 p=p->next;
 63             
 64         
 65     } 
 66     return;
 67 }
 68 
 69 void displaystulist(stulist* head){
 70     stulist* p=head->next;
 71     while(p){
 72         printf("%s",p->name);
 73         printf("%d",p->score);
 74         p=p->next;
 75         printf("\n");
 76     }
 77 
 78     return;
 79 }
 80 
 81 int menu_select()
 82 {
 83     int n;
 84     printf("\n\t\t\t 学生成绩管理程序:\n");
 85     printf("\n\t\t\t 1.插入学生成绩记录");
 86     printf("\n\t\t\t 2.销毁学生成绩记录");
 87     printf("\n\t\t\t 3.打印学生成绩登记表");
 88     printf("\n\t\t\t 4.将学生成绩排序并打印输出(按成绩升序排列)");
 89     printf("\n\t\t\t 0.退   出 \n");
 90     do
 91     {
 92         printf("\n\t\t\t请按数字0~4键选择功能:");
 93         scanf("%d",&n);
 94     }while((n < 0)||(n >4));
 95     return n;
 96 }
 97 
 98 int main(){
 99     int n,a;
100     stulist L;
101     printf("请输入新建结点个数:");
102     scanf("%d",&n);
103 do{
104     a=menu_select();
105             switch(a){
106             case 1:inputstulist(&L,n);    break;
107             case 2:delstulist(&L); break;
108             case 3:displaystulist(&L); break;
109             case 4:sortstulist(&L,n); displaystulist(&L); break;
110             case 0:break;
111             default: break;}
112     if(a==0){
113         break;}
114     }while(a!=0);
115     return 0;
116 }

 

以上是关于折磨了我 N 次的 单链表的主要内容,如果未能解决你的问题,请参考以下文章

浅谈单链表与双链表的区别

小代码 单链表之反转 然后交错重连+稀疏矩阵

如何将值插入单链表

反转单链表-常数附加空间且O(N)时间

博客第二天——头插法建立单链表

单链表结点的插入与删除