C语言-创建链表及排序

  1 #include <stdio.h>
  2 #define NEWNODE (Node *)malloc(sizeof(Node)) 
  3 
  4 typedef struct mynode{
  5     int num;
  6     struct mynode *next;
  7 }Node;
  8 
  9 Node* creat(){
 10     Node *head=NULL,*p,*q;
 11     //head:表头,q:表尾 
 12     q=p=NEWNODE;
 13     scanf("%d",&p->num);
 14     p->next=NULL;
 15     while(p->num>0){
 16         if(head==NULL){
 17             head=q=p;
 18         }else{
 19             q->next=p;
 20             q=p;
 21         }
 22         p=NEWNODE;
 23         scanf("%d",&p->num);
 24         p->next=NULL;
 25     }
 26     return head;
 27 }
 28 
 29 void print(Node *head){
 30     Node *p;
 31     p=head;
 32     while(p)
 33     {
 34         printf("%d ",p->num);
 35         p=p->next;
 36     }
 37     printf("\n");
 38 }
 39 
 40 int len(Node *head){
 41     int k=0;
 42     Node *p;
 43     p=head;
 44     while(p)
 45     {
 46         k++;
 47         p=p->next;
 48     }
 49     return k;
 50 }
 51 
 52 //选择排序-交换结点 
 53 Node *select_sort(Node *head){
 54     Node *begin=NULL,*end=NULL;    //有序链表的首尾结点指针
 55     Node *p;
 56     Node *min,*premin;    //最小结点及其前一个结点
 57     if(!head)return NULL;
 58     while(head){
 59         //循环找出无序链表中的最小结点min及其前一个结点premin
 60         p=head;
 61         min=p;
 62         while(p->next){
 63             if(min->num>p->next->num){
 64                 premin=p;
 65                 min=p->next;
 66             }
 67             p=p->next;
 68         }
 69         //1. 将min接入有序链表 
 70         //如果有序链表为NULL 
 71         if(begin==NULL){
 72             begin=end=min;
 73         }else{
 74             end->next=min;
 75             end=min;
 76         }
 77         //2. 在无序链表中删除结点min
 78         if(min==head){
 79             head=min->next;
 80         }else{
 81             premin->next=min->next;
 82         }         
 83     }
 84     end->next=NULL;
 85     return begin;    
 86 }
 87 
 88 //冒泡排序-交换值 
 89 void pubble_sort(Node *head)
 90 {
 91     Node *end;
 92     int t;
 93     Node *p,*pre;
 94     p=head;
 95     //end~NULL为有序部分,将end置为尾结点 
 96     while(p->next)p=p->next;
 97     end=p;
 98     //每轮冒泡end左移一个结点,一直到head与end重合 
 99     while(head!=end){
100         p=head;
101         while(p!=end){
102             if(p->num>p->next->num){
103                 t=p->num;
104                 p->num=p->next->num;
105                 p->next->num=t;
106             }
107             pre=p;
108             p=p->next;
109         }
110         end=pre;
111     }
112 }
113 
114 
115 
116 int main()
117 {
118     Node *head;
119     head=creat();
120     
121     pubble_sort(head);
122     
123     print(head);
124     
125     return 0;
126 }

 

转载于:https://www.cnblogs.com/zandbin/p/5334723.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值