单链表的一些操作

      在前一篇写了工具函数,以后的每篇几乎都会用到tools.h文件,如果在linux下编译就需要这样,举例 gcc list.c  tools.c  main.c -o main  把这3个文件编译链接成可执行文件main,linux下./main就可以运行了。

     还是在开始提一下吧,为什么在销毁链表的时候需要用到双重指针,因为不仅要释放指针所指向的这快区域,还是把该指针释放了,因为free完指针指向的空间,指针还是指着这片区域,如果再次访问就会出现未知的错误,也就是C语言中的未定义,未确定行为

 单链表头文件的声明 list.h

#ifndef _LIST_H_
#define _LIST_H_

#include "tools.h"


typedef struct List_node
{
    int     data;            //数据域
    struct  List_node *next; //指针域
}List_node;


List_node *init_list(void);        //链表的初始化
void destroy_list(List_node **head); //链表的销毁
Boolean push_front(List_node *head,int value);//头部插入
Boolean push_back(List_node *head,int value);//尾部插入
Boolean pop_front(List_node *head);   //头部删除
Boolean pop_back(List_node *head);    //尾部删除
Boolean delete_list_node(List_node *head,  
                         List_node *node); //删除某个指针的值
Boolean find_value_node(List_node *head,
                        int value,
                        List_node **node); //找到指定值的地址 
void show_list(List_node *head);           //显示链表
void sort_list_ascend(List_node *head);    //升序排序
void sort_list_descend(List_node *head);   //降序排序
int get_list_length(List_node *head);      //链表的长度



#endif


 单链表头文件的实现list.c 


#include "list.h"


static List_node *create_node(void);

//创建头结点 ,只能在本文件使用
static List_node *create_node(void)
{
    List_node *node = (List_node*)Malloc(sizeof(List_node));
    bzero(node,sizeof(List_node));
    return node;
}

 //链表的初始化
List_node *init_list(void)
{
    List_node *head = create_node();
     
    return head;
 
}

//链表的销毁
void destroy_list(List_node **head)
{
     List_node *p_node = NULL;
     if(head == NULL || *head == NULL){
        return ;
     }

     p_node = (*head);

     while((*head) != NULL){
        (*head) = (*head)->next;
        free(p_node);
        p_node = (*head);
     }

     free(*head);
     *head = NULL;

}

//头部插入
Boolean push_front(List_node *head,int value)
{
    List_node *p_node = NULL;
    List_node *node = NULL;
    if(head == NULL){
        return FALSE;
    }

    p_node = head->next;

    node = create_node();
    node->data = value;

    if(p_node == NULL){
        head->next = node;
    }else{
        node->next = head->next;
        head->next = node;
    }
    return TRUE;

}

//尾部插入
Boolean push_back(List_node *head,int value)
{
    List_node *p_node = NULL;
    List_node *node = NULL;
    if(head == NULL){
        return FALSE;
    }

    p_node = head->next;s

    node = create_node();
    node->data = value;

    if(p_node == NULL){
        head->next = node;
    }else{

        while(p_node->next){
            p_node = p_node->next;
        }

        node->next = p_node->next;
        p_node->next = node;
    }
    return TRUE;

}

 //头部删除
Boolean pop_front(List_node *head)
{
    List_node *p_node = NULL;
    if(head == NULL){
        return FALSE;
    }
    p_node = head->next;

    if(p_node == NULL){
        return FALSE;
    }else if(p_node->next == NULL){
        head->next = NULL;
    }else{
        head->next = p_node->next;
    }
    
    free(p_node);
    p_node = NULL;
    
    return TRUE;

}

//尾部删除
Boolean pop_back(List_node *head)
{
    List_node *p_node = NULL;
    List_node *q_node = NULL;
    if(head == NULL){
        return FALSE;
    }
    p_node = head->next;
    q_node = head;

    if(p_node == NULL){
        return FALSE;
    }else if(p_node->next == NULL){
        head->next = NULL;
    }else{
        while(p_node->next != NULL){
            q_node = q_node->next
            p_node = p_node->next;
        }
        free(p_node);
        p_node = NULL;
        q_node->next = NULL;
        
    }
        
    return TRUE;
}

//删除某个指针的值
Boolean delete_list_node(List_node *head,
                         List_node *node)
{
    List_node *p_node = NULL;
    if(head == NULL || head->next == NULL || node == NULL){
        return FALSE;
    }

    p_node = head;
    while(p_node->next != node){
        p_node = p_node->next;
        if(p_node == NULL)
            break;
    }

    if(p_node == NULL){
        reurn FALSE;
    }


    p_node->next = node ->next;
    free(node);
    node = NULL;
   
    return TRUE;

}

//找到指定值的地址 
Boolean find_value_node(List_node *head,
                        int value,
                        List_node **node)
{
    List_node *p_node = NULL;
    if(head == NULL || node == NULL || *node == NULL){
        return FALSE;
    }

    p_node = head->next;
    while(p_node != NULL){
        if(p_node->data == value){
            *node = p_node;
             return TRUE;
        }
        p_node = p_node->next
    }

    return FALSE;

}

//显示链表
void show_list(List_node *head)
{
    List_node *p_node = NULL;
    if(head == NULL){
        return FALSE;
    }

    p_node = head->next;
    while(p_node){
        printf("%d ",p_node->data);
        p_node = p_node->next;
    }
    printf("\n");

}

//升序排序
void sort_list_ascend(List_node *head)
{
    List_node *p_node = NULL;
    List_node *q_node = NULL;
    if(head == NULL || head->next == NULL
       head->next->next == NULL){
        return ;
    }

    for(p_node = head->next; p_node; p_node = p_node->next)
       for(q_node = p_node->next; q_node; q_node = q_node->next)
           if(p_node->data > q_node->data)
           {
                swap(p_node,q_node,sizeof(List_node)-sizeof(List_node*));               

           }

}

//降序排序
void sort_list_descend(List_node *head)
{
    List_node *p_node = NULL;
    List_node *q_node = NULL;
    if(head == NULL || head->next == NULL
       head->next->next == NULL){
        return ;
    }

    for(p_node = head->next; p_node; p_node = p_node->next)
       for(q_node = p_node->next; q_node; q_node = q_node->next)
           if(p_node->data < q_node->data)
           {
                swap(p_node,q_node,sizeof(List_node)-sizeof(List_node*));               

           }

}

//链表的长度
int get_list_length(List_node *head)
{
    int count = 0;
    List_node *p_node = NULL;
    if(head == NULL){
        return ERROR;
    }

    p_node = head->next;
    while(p_node){
        count++;
        p_node = p_node->next;
    }

    return count;

}

以上这个链表,也就是单链表的最基本的应用,虽然比起数组插入删除简单多了,但是效率还是太低了,每次都从第一个开始,烦、烦、烦,因此就需要改进,请看下一篇,带有控制信息的单链表。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值