单向循环链表

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>   //随机函数

struct node_head
{
    int num;

    struct node_head *next;
};

typedef struct node_head Hnode;
typedef Hnode * Hlink;

/*判断是否为空的处理*/
void is_malloc_ok(Hlink new_node)
{
    if(new_node == NULL)
    {
        printf("malloc error!\n");
        exit(-1);
    }
}

/*创建新的结点*/
void create_node(Hlink * new_node)
{
    *new_node = (Hlink) malloc(sizeof(Hnode));
    is_malloc_ok(*new_node);
}

/*创建链表*/
void create_link(Hlink *head)
{
    create_node(head);
    (*head)->next = NULL;
}

/*头插*/
void insert_node_head(Hlink head,Hlink new_node)
{
    new_node->next = head->next;
    head->next = new_node;
}

/*输出*/
void display(Hlink head)
{
    Hlink p;

    if(head == NULL)                //表头为空,没有这个链表
    {
        printf("no such Link!\n");
        return;
    }

    p = head->next;

    if(NULL == head->next)
    {
        printf("Link is empty!\n");
        return;
    }

    while(NULL != p)
    {
        printf("%d\n",p->num);
        p = p->next;
    }
}

/*尾插 */
void insert_node_tail(Hlink head,Hlink new_node)
{
    Hlink p;
    p = head;   //不能head->next,因为是处理尾结点后面,而不是尾结点后面

    while(NULL != p->next)
    {
        p = p->next;
    }

    p->next = new_node;
    new_node->next = NULL;
}

/*边插入边排序*/
void insert_node_sort(Hlink head,Hlink new_node)
{
    Hlink p,q;//定义一个指针,用来找位置,要插在前面,所以两个指针
    
    q = head;
    p = head->next; //头结点的后面,空链表一样插,所以不用考虑

    while(p != NULL && p->num < new_node->num)//只要p不指向末尾,而且p指向结点的值小于new_node的值,由小到大的排
    {
        q = p;              //移动这两个指针
        p = p->next;                                                    
    }

    q->next = new_node;     //没有找到,插到尾巴上去,q的后面,p的前面
    new_node->next = p;

}

/*清空*/
void make_empty(Hlink head)
{
    Hlink p;
    p = head->next;

    while(NULL != p)    //p没有指向最后一个结点的后面
    {
        head->next = p->next;
        free(p);
        p = head->next;
    }
}

/*释放*/
void release_link(Hlink *head) //所有的,包括表头结点一块释放
{
    make_empty(*head);      //除了表头全删

    free(*head);            //释放表头结点

    *head = NULL;           //表头结点指向空,不然还是原来的表头
}

/*删除*/
void delete_node(Hlink head,int num_del)
{
    Hlink p,q;
    p = head;
    q = head->next;

    if(NULL == head->next)
    {
        printf("Link is empty!\n");
    }

    while(NULL != p && p->num != num_del)
    {
        q = p;
        p = p->next;  //不断往后找
    }
    if(NULL == p)
    {
        printf("no such node!\n");
    }
    else
    {
        q->next = p->next;
        free(p);
    }
}

int main()
{
    Hlink head;
    Hlink new_node;
    int i;
    int loc;
    int num_del;

    create_link(&head);

    srand((unsigned)time(NULL));    //随机函数初始化,就不需要i赋值

    for(i = 0;i < 10;i++)
    {
        create_node(&new_node);
    //    new_node->num = i + 1;
        new_node->num = rand() % 100;   //生成随机数,但是比较大,32位的实进制数,所以除100,生成0到100的数

     //   insert_node_head(head,new_node);
      //  insert_node_tail(head,new_node);
        insert_node_sort(head,new_node); //边插入边排序,不改变头指针,所以是head
    }

    display(head);
    printf("\n\n");

    printf("please input num to delete:\n");
    scanf("%d",&num_del);

    delete_node(head,num_del);      //删除
    display(head);

    make_empty(head);   //清空,除了表头结点,剩下的位置清空
    display(head);

    release_link(&head);    //释放链表,包括表头
    display(head);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值