通用链表

作者: 76577fe9b28b | 来源:发表于2017-05-05 17:46 被阅读9次

1.头文件

#ifndef LinkList_h
#define LinkList_h

#include <stdio.h>

typedef struct Node{
    
    struct Node *next;
    
}Node;

typedef struct LinkNode{
    
    Node node;
    void * data;
}LinkNode;

typedef struct LinkList{
    
    //链表长度
    int length;
    
    //链表的头结点
    LinkNode listNode;
}LinkList;

//初始化链表
void initList(LinkList *list);

//判断链表是否为空
int emptyList(LinkList *list);

//清空链表
void clearList(LinkList *list);

//获取指定位置的数
void getDataByIndex(LinkList *list, int index, void **da);

//在指定位置插入数据
void insertDataByIndex(LinkList *list,int index, void *da);

//删除指定位置的数据,并把数据存到da中
void deleteDataByIndex(LinkList *list, int index,void **da);

//获取链表的长度
int getLength(LinkList *list);


#endif /* LinkList_h */

2.实现

#include "LinkList.h"
#include <stdlib.h>
//初始化链表
void initList(LinkList *list){
    
    list->length = 0;
    list->listNode.node.next = NULL;
    
}

//判断链表是否为空
int emptyList(LinkList *list){
    
    if (list->length > 0) {
        
        return 1;
    }
    
    return 0;
}

//清空链表
void clearList(LinkList *list){
    
    while (emptyList(list)) {
        
        int *da;
        deleteDataByIndex(list, 0, &da);
        
        printf("%d\n", *da);
    }

}

//获取指定位置的数
void getDataByIndex(LinkList *list, int index, void **da){
    
    if (index < 0 || index >= list->length ) {
        
        return;
    }
    
    LinkNode *pNode = &list->listNode;
    
    for (int i = 0; i <= index; i++) {
        
        pNode = (LinkNode *)pNode->node.next;
    }
    
    *da = pNode->data;
    
}

//在指定位置插入数据
void insertDataByIndex(LinkList *list,int index, void *da){
    
    if (index < 0 || index > list->length) {
        
        return;
    }
    
    //开辟结点空间
    LinkNode *linkNode = calloc(1, sizeof(*linkNode));
    linkNode->data = da;
    linkNode->node.next = NULL;
    
    //记录插入点的前一个结点
    LinkNode *pNode = &list->listNode;
    
    for (int i = 0; i < index; i++) {
        
        pNode = (LinkNode *)pNode->node.next;
        
    }
    
    linkNode->node.next = pNode->node.next;
    pNode->node.next = &linkNode->node;
    
    list->length++;
}

//删除指定位置的数据,并把数据存到da中
void deleteDataByIndex(LinkList *list, int index,void **da){
    
    if (index < 0 || index >= list->length ) {
        
        return;
    }
    
    //记录插入点的前一个结点
    LinkNode *pNode = &list->listNode;
    
    for (int i = 0; i < index; i++) {
        
        pNode = (LinkNode *)pNode->node.next;
    }
    
    LinkNode *cNode = (LinkNode *)pNode->node.next;
    pNode->node.next = cNode->node.next;
    
    *da = cNode->data;
    free(cNode);
    
    list->length--;
}

//获取链表的长度
int getLength(LinkList *list){
    
    return list->length;
}

相关文章

  • 通用链表

    1.头文件 2.实现

  • 通用链表变形

    头文件 2.api实现 3.测试 (1)存放结构体 (2)存放int类型

  • Linux 内核通用链表学习

    描述 在linux内核中封装了一个通用的双向链表库,这个通用的链表库有很好的扩展性和封装性,它给我们提供了一个固定...

  • 链表篇

    有环链表判断,快慢指针 通用克隆数据结构方法 Tricky 方法

  • 数据结构之LinkList链表

    链表与数组在数据结构的江湖上被并称为南数组、北链表,其江湖地位可见一斑 概念 链表作为最基础的通用存储结构,它的作...

  • 通用双链表(C语言)

    1、头文件c_doublelist.h 2、相关操作函数实现文件c_doublelist.c 3、主函数测试文件m...

  • 通用单链表(C语言)

    1、头文件c_linklist.h 2、操作链表文件c_linklist.c 3、测试主函数文件main.c 注意...

  • Java数据结构

    一。通用数据结构:数组,链表,树,哈希表通用数据结构通过关键字的值来存储并查找数据,如报表,合同,记录,业绩等数据...

  • L16. linux通用链表

    引言 链表的实现是基于结构体与指针两者实现的,常用的链表数据结构如下: 如上链表设计与本身的数据域相关性太大,很难...

  • MySql--undo日志(下)

    具体细节 请去掘金购买《MySQL 是怎样运行的:从根儿上理解 MySQL》 通用链表结构(页通过这些pageNu...

网友评论

    本文标题:通用链表

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