美文网首页
C的链表实现

C的链表实现

作者: zuolingfeng | 来源:发表于2015-08-06 17:51 被阅读979次

最近写了链表的实现。先贴代码。

(代码是在linux gcc下编译,有可能和vs上编译有差别)

1,链表实现:

/** 
*@breif: 实现带头结点的链表结构 
*@auther:Linf 
*@data:2012-12-28 09:28 
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct list{
    int num;
    struct list* next;
}List;

/**
*func:初始化链表。
*由于函数中调用malloc。记得free。防止内存泄露
*return:链表指针
*/
static List* initList()
{
    List* list = NULL;
    list = (List *)malloc(sizeof(List));
    if(list == NULL)
    {
        printf("[initList]malloc list failed!\n");
        return NULL;
    }
    list->next = NULL;
    return list;
}

/**
*func:打印链表信息
*param:链表头结点
*return:NULL
*/
static void priList(List* list)
{
    if(list == NULL)
        return ;
    printf("----------------------\n");
    while(list->next)
    {
        printf("%d,\n", list->next->num);
        list = list->next;
    }
    printf("----------------------\n");
    return;
}

/**
*func:根据num大小插入链表节点
*param:list - 头结点,num - 插入的数据(可根据类型扩展)
*return:0 insert success. -1 insert error
*/
static int insertList(List** list, int num)
{
    List* now = NULL;
    List* head = *list;
    now = initList();
    if(now == NULL)
        return -1;
    now->num = num;
    while(head->next && num >= head->next->num)
        head = head->next;
    //插入在第一个位置和最后一个位置
    if(head->next == NULL)
        head->next = now;
        //插入到中间位置
    else
    {
        now->next = head->next; 
        head->next = now;
    }
    return 0;
}

/**
*func:计算链表的长度
*param:li - 头结点
*return:NULL
*/
static int numList(List* head)
{
    int len = 0;
    while(head && head->next)
    {
        len++;
        head = head->next;
    }
    return len;
}

/**
*func:调用free逐个释放链表节点
*param:list - 链表头结点
*return:NULL
*/
static void freeList(List** list)
{
    List* head = *list;
    List* p = NULL;
    while(head)
    { 
        p = head;
        head = head->next;
        free((void *)p);
    }
    printf("free List ok\n");
    return;
}

/**
*func:删除相应位置的链表节点
*param:list - 链表头结点,w - 删除位置(should >0 & < sizeof(list))
*return: 0 success delete. -1 success failed.
*/
static int deleteList(List** list, int location)
{
    List* head = *list;
    List* p = NULL;
    int i = 1;
    if(location <= 0 || location > numList(head))
        return -1;
    while(i++ < location && head->next)
        head= head->next;
    p = head->next;
    head->next = p->next;
    if(p)
    {
        free((void *)p);
        p = NULL;
    }
    return 0;
}

int main(int argc, char** argv)
{
    List* head = NULL;
    int i = 0;
    head = initList();
    if(head == NULL)
        return -1;
    insertList(&head, 2);
    insertList(&head, 4);
    insertList(&head, 6);
    insertList(&head, 3);
    insertList(&head, 1);
    priList(head);
    deleteList(&head, 1);
    priList(head);
    deleteList(&head, 2);
    priList(head);
    deleteList(&head, 3);
    priList(head);
    freeList(&head);
    return 0;
}

相关文章

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • Java实现简单的链表-面向初学者

    很久之前用C语言实现过链表,现在已经太久没用C语言。就先用JAVA实现一个简单链表好了,还是使用最原始的C语言实现...

  • C++实现双向循环链表

    本次博文是关于利用C++模板的方式实现的双向循环链表以及双向循环链表的基本操作,在之前的博文C++语言实现双向链表...

  • c++ 实现队列

    相关资料: 用C++实现一个队列 数据结构代码实现之队列的链表实现(C/C++)

  • Redis 源码--链表。

    因为C语言是一个比较底层的语言,库内没有实现链表,于是Redis自己实现了链表。Redis的链表是一个双向链表。 ...

  • LeetCode 141 环形链表 Linked List Cy

    有关链表的LeetCode做题笔记合集,Python实现 链表定义 141. 环形链表 Linked List C...

  • C++语言实现双向链表

    这篇文章是关于利用C++模板的方式实现的双向链表以及双向链表的基本操作,在之前的博文C语言实现双向链表中,已经给大...

  • C# 链表

    链表介绍 Unity 用C#写的链表类 简述链表和数组的区别 Unity--链表实现贪吃蛇

  • 容器(2) - LinkedList

    LinkedList 基本实现 LinkedList 类似 C/C++ 的双向链表,这种链表中任意一个存储单元都可...

  • 单链表的C语言算法实现

    单链表的C语言算法实现 自己用C语言实现的单链表算法,有什么不正确的地方,请各位共同讨论与指正。

网友评论

      本文标题:C的链表实现

      本文链接:https://www.haomeiwen.com/subject/johbqttx.html