数据结构中链表节点随机取值,且从小到大排序

#include<stdio.h>
#include<stdlib.h>
struct node //从小到大排序,任意取值
{
    int num;

    struct node * next;
};

typedef struct node Node;
typedef struct node * Link;

void create_link(Link * head)
{
    *head = NULL;
}

void create_node(Link * new_node)
{
    *new_node = (Link)malloc(sizeof(Node));
}

void insert_node_tail(Link * head,Link new_node)
{
    Link p;
    p = *head;
    if(NULL==*head)
    {
        *head=new_node;
        new_node->next=NULL;
    }
    else
    {
        while(p->next !=NULL)
    {
        p=p->next;
    }
    p->next=new_node;
    new_node->next=NULL;
    }
}

void insert_node_mid_sort(Link * head,Link new_node)
{
    Link p;
    Link q;
    p=NULL;//总是被忽略
    q=NULL;
    q = *head;
    p = *head;//若p=(*head)->next,那么少头结点的判断
    if(NULL==*head)//p
    {
        *head = new_node;
        new_node->next = NULL;
    }
    else
    {
        while(p !=NULL && p->num < new_node->num)//->next特别重要
        {
            q=p;
            // q->next=p;//严重错误不是指向,是位置改变
            p = p->next;//一定要理解这个写法
        }
        if(p == *head)
        {
            new_node->next = p;
            *head=new_node;
        }
        else
        {
            new_node->next=p;
            q->next = new_node;
        }
    }
}

void display_link(Link head)
{
    Link p=NULL;
    p = head;
    if(NULL==p)
    {
        printf("Link is Empty!\n");
        return;       //这句不能少!!!流程返回,值不返回。
    }
    while(p != NULL)
    {
        printf("%5d",p->num);//与printf("%5d\n",p->num);不同
        p = p->next;
    }
    printf("\n");
}

void release_link(Link * head)
{
    Link p=NULL;      //先赋值啊!!!
    p=*head;
    while(*head!=NULL)    //这里不能写p,p被释放
    {
        p=*head;
        *head=(*head)->next;
        free(p);
    }
}

int main()
{
    Link head=NULL;
    Link new_node=NULL;
    srand((unsigned)time(NULL));//随机取值
   
    int i;
    create_link(&head);
    for(i=0;i<10;i++)
    {
        create_node(&new_node);
        new_node->num=rand()%100;//100以内
        //new_node->num=i+1;
        insert_node_mid_sort(&head,new_node);//!!将每个数排序!!
        // insert_node_tail(&head,new_node);//用不着倒插
    }
    create_node(&new_node);//
    display_link(head);
    printf("Input new_node->num:");
    scanf("%d",&new_node->num);//搞忘了,num是int型

    insert_node_mid_sort(&head,new_node);//!!此程序写两次!!
   
    create_node(&new_node);//
    display_link(head);
    

    release_link(&head);
    
    create_node(&new_node);//
    display_link(head);
    

    return 0;      //这句不能少!!!
}

输出结果

judy@judy-virtual-machine:~/桌面/ft$ gcc yx5.c -oyx5
yx5.c: In function ‘main’:
yx5.c:110:21: warning: implicit declaration of function ‘time’ [-Wimplicit-function-declaration]
     srand((unsigned)time(NULL));//随机取值
                     ^~~~
judy@judy-virtual-machine:~/桌面/ft$ ./yx5
   10   13   17   27   33   55   70   81   83   85
Input new_node->num:89
   10   13   17   27   33   55   70   81   83   85   89
Link is Empty!
judy@judy-virtual-machine:~/桌面/ft$ 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值