C语言:用单链表实现输入排序

纯当练习
链表头结点存储的信息是链表长度
平台VS2015

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct ListNode {
    int val;
    struct ListNode *next;
};
void createList(struct ListNode* list, int listsSize) {
    struct ListNode *listHead = list;       //指向头结点的头指针
    struct ListNode *tail = listHead->next; //指向最后一个元素的尾指针
    struct ListNode *p;                     //在头指针和尾指针之间活动的指针
    struct ListNode *body;                  //用于创建新的节点
    int i = 0;

    if (listsSize <= 0)
        return;
    srand(time(NULL));  //用于创建随机数,我用随机数模拟了输入(懒),见21行和28行
    puts("input:data");
    body = (struct ListNode *)malloc(sizeof(struct ListNode));
    body->next = NULL;
    body->val = rand() % 10;
    body->next = listHead->next;
    listHead->next = body;
    tail = body;

    while (i<listsSize-1)
    {
        body = (struct ListNode *)malloc(sizeof(struct ListNode));
        body->next = NULL;
        body->val = rand() % 10;

        if (body->val <= listHead->next->val)
        {//如果数据小于第一个节点的数据(也就是头指针的下一个节点),
         //就插在头指针及其后一个节点之间
            body->next = listHead->next;
            listHead->next = body;

        }

        else if (body->val > tail->val)
        {//数据大于尾指针,则放到链表最后

            tail->next = body;
            tail = tail->next;
        }

        else
        {//在第一个节点和最后一个节点范围之间,则寻找合适的大小位置

            p = listHead->next;
            while (body->val > p->next->val&&p != tail)
            {
                p = p->next;
            }
            body->next = p->next;
            p->next = body;

        }
        i++;
    }
    list->val = listsSize;

}

void DisplayList(struct ListNode *list)
{
    struct ListNode *p = list->next;
    int i = 0;
    while (i < list->val-1)
    {
        printf("%d->", p->val);
        p = p->next;
        i++;
    }
    printf("%d", p->val);


}
void DestroyList(struct ListNode *list)
{
    struct ListNode *p = list->next;
    while (p!= NULL)
    {
        free(list);
        list = p;
        p = p->next;
    }
    free(list);

}
int main()
{
    struct ListNode *list = (struct ListNode *)malloc(sizeof(struct ListNode));

    //默认创建链表长度为5
    createList(list, 5);
    //打印链表
    DisplayList(list);
    DestroyList(list);
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值