设为首页 加入收藏

TOP

关于单链表的排序问题(二)
2018-12-06 10:08:57 】 浏览:287
Tags:关于 单链表 排序 问题
点接在b链表(空链表)的头指针后面,

再通过q的前后驱动节点将q从a链表中剔除,接下来又在a链表中寻找最高分节点q',如此循环           直到a链表为空。

  代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 //创建STUDENT类型变量 包括学号、姓名、成绩
 5 typedef struct student {
 6     int  number;
 7     char name[50];
 8     int  score;
 9     struct  student *pNext;
10 }STUDENT;
11 //创建链表
12 STUDENT *Create(int n) {
13     STUDENT *pHead, *pEnd, *pNew = NULL;
14     int i; char str[100][50];
15     pHead = pEnd = (STUDENT*)malloc(sizeof(STUDENT));
16     for (i = 0; i < n; i++)
17     {
18         pNew = (STUDENT*)malloc(sizeof(STUDENT));
19         scanf("%d%s%d", &pNew->number, &str[i], &pNew->score);
20         strcpy(pNew->name, str[i]);//只有字符串初始化时才能使用“=”赋值
21         pNew->pNext = NULL;
22         pEnd->pNext = pNew;
23         pEnd = pNew;
24 
25     }
26     return pHead;
27 }
28 //寻找前驱节点
29 STUDENT *Find_before(STUDENT* phead, STUDENT* p)
30 {
31     if (!p) return NULL;
32     STUDENT *pbefore = phead;
33     while (pbefore)
34     {
35         if (pbefore->pNext == p)
36             return pbefore;
37         pbefore = pbefore->pNext;
38     }
39     return NULL;
40 }
41 
42 STUDENT *Sort(STUDENT *head) {
43     STUDENT *pHead,*pEnd,*q=NULL,*qbefore=NULL,*p=NULL;
44     int maxscore;
45     pHead=pEnd = (STUDENT*)malloc(sizeof(STUDENT));
46     while (head->pNext != NULL)
47     {
48         maxscore = head->pNext->score;
49         q = p = head->pNext;
50         //寻找最高分节点p
51         while (p->pNext!=NULL)
52         {
53             if(maxscore<p->pNext->score)
54             {
55                 maxscore = p->pNext->score; q = p->pNext;
56             }
57             p = p->pNext;
58         }
59         pEnd->pNext = q;    //将头指针指向q
60         q->pNext = NULL;    //q节点指向空
61         pEnd = q;            //更新尾节点
62         qbefore = Find_before(head,q);  //寻找q节点的前驱节点
63         qbefore->pNext = q->pNext; //将q的前驱节点指向q的后驱节点 从而将q节点从a链表中剔除
64     }
65     free(head);//释放head链表头节点
66     return pHead;
67 }
68 void print(STUDENT *q) {
69     while (q->pNext != NULL)
70     {
71         q = q->pNext; printf("%s\n", q->name);
72     }
73     free(q);//释放使用完的链表
74 }
75 int main() {
76     int n, i = 1; STUDENT *p,*q;
77     scanf("%d", &n);
78     p = Create(n);
79     q=Sort(p);
80     print(q);
81 }

        如果有什么错误,请指正! 万分感谢!

 

 

 

  

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇PAT (Basic Level) Practice (中.. 下一篇C 数据结构堆

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目