单链表的排序

#include<stdio.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node
{
    DataType data;               //数据域
    struct Node *next;      //指针域
}LNode;
void Initiate(LNode **head)       //初始化
{
    *head = (LNode *)malloc(sizeof(LNode));   //对头结点head 开辟空间
    (*head)->next = NULL;                     //结束标志位NULL
}
int Length(LNode *head)
{
    LNode *p = head;                        //P指向头结点
    int size = 0;                            //size用来计算链表元素整个的长度   初始化为0
    while(p->next != NULL)
    {
        p = p->next;
        size++;
    }
    return size;
}
int Insert(LNode *head,int i,DataType x)
{
    LNode *p,*q;
    int j;
    p = head ;
    j = -1;
    while (p->next != NULL && j < i-1)
    {
        p = p->next;
        j++;
    }
    if(j != i -1)
    {
        printf("插入元素的位置参数有错");
        return 0;
    }
    q = (LNode *)malloc(sizeof(LNode));   //生成 新节点
    q->data = x;                          //给新节点赋值
    q->next = p->next;
    p->next = q;
    return 1;
}
int Get(LNode *head,int i,DataType *x)//取链表元素
{
    LNode *p;
    int j;
    p = head;
    j = -1;
    while(p->next != NULL && j < i)//若链表内无i位置的元素  则报错
    {
        p = p->next;
        j++;
    }
    if(j != i)
    {
        printf("元素的参数有错!");
        return 0;
    }
    *x = p->data;  
    return 1;

}
void Destory (LNode **head)  //释放所有的结点
{
     LNode *p,*pl;
     p= *head;
     while(p != NULL)
     {
         pl = p;
         p  = p->next;
         free(pl);
     }
     *head = NULL;
}
int sort(LNode *head)// 对链表元素进行逆序排序
{
    LNode *p;
    p = head;
    int temp;
    if(p == NULL && p->next == NULL)
    {
        return 0;
    }
    int n = Length(head);
          for(int i=1; i<n; i++)
        { 
            p = head->next;
            for(int j=0; j<n-i; j++)
            {
                if(p->data < p->next->data) 
                {
                    temp = p->data;
                    p->data = p->next->data;
                    p->next->data = temp;
                 }
                p = p->next;
            }
        }
          return 1;
        
}
int main()
{
    LNode *head;//定义头指针的变量
    int i, x, a;
    Initiate(&head);
    for(i = 0;i <5;i++)
    {
        scanf("%d",&a);
        Insert(head,i,a);
    }
    sort(head);
    for(i = 0;i < Length(head);i++)
    {
        Get(head, i, &x);
        printf("%d\t",x);
    }
    Destory(&head);    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值