zoukankan      html  css  js  c++  java
  • C语言 数据结构单向循环列表

     1 #ifndef LINKLIST_H
     2 #define LINKLIST_H
     3 
     4 #include<stdlib.h>
     5 #include<stdio.h>
     6 
     7 //链表结点
     8 typedef struct LINKNODE {
     9     void* data; //指向任何类型的数据
    10     struct LINKENODE* next;
    11 }LinkNode;
    12 
    13 //链表结构体
    14 typedef struct LINKLIST {
    15     LinkNode* head;
    16     int size;
    17 }LinkList;
    18 
    19 //打印函数指针
    20 typedef void(*PRINTLINKNODE)(void*);
    21 
    22 //初始化链表
    23 LinkList* Init_LinkList();
    24 //指定位置插入
    25 void Insert_LinkList(LinkList* list, int pos, void* data);
    26 //删除指定位置的值
    27 void RemoveByPos_LinkList(LinkList* list, int pos);
    28 //获得链表的长度
    29 int Size_LinkList(LinkList* list);
    30 //查找
    31 int Find_LinkList(LinkList* list, void* data);
    32 //打印链表结点
    33 void print_LinkList(LinkList* list, PRINTLINKNODE print);
    34 //返回第一个结点
    35 void* Front_LinkList(LinkList* list);
    36 #endif
    #include"LinkList.h"
    
    
    //初始化链表
    LinkList* Init_LinkList() {
     
        LinkList* list = (LinkList*)malloc(sizeof(LinkList));
        list->size = 0;
    
        //头结点是不保存数据信息的
        list->head = malloc(sizeof(LinkNode));
        list->head->data = NULL;
        list->head->next = NULL;
        return list;
    }
    //指定位置插入
    void Insert_LinkList(LinkList* list, int pos, void* data) {
        if (list == NULL) {
            return;
        }
        if (data == NULL) {
            return;
        }
        //友好的处理,pos越界
        if (pos < 0 || list->size) {
            pos = list->size;
        }
        //创建新的结点
        LinkNode* newnode = (LinkList*)malloc(sizeof(LinkNode));
        newnode->data=data;
        newnode->next = NULL;
        //找结点
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrent = pCurrent->next;
        }
        //新结点入链表
        newnode->next = pCurrent->next;
        pCurrent->next = newnode;
    
        list->size++;
    }
    //删除指定位置的值
    void RemoveByPos_LinkList(LinkList* list, int pos) {
        if (list == NULL) {
            return;
        }
        if (pos < 0 || list->size) {
            return;
        }
        //查找删除结点的前一个结点
        LinkNode* pCurrnet = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrnet = pCurrnet->next;
        }
        //缓存删除的结点
        LinkNode* pDel = pCurrnet->next;
        pCurrnet->next = pDel->next;
        //释放删除结点的内存
        free(pDel);
        list->size--;
    }
    //获得链表的长度
    int Size_LinkList(LinkList* list) {
        return list->size;
    }
    //查找
    int Find_LinkList(LinkList*  list, void* data) {
        if (list == NULL) {
            return -1;
        }
        if (data == NULL) {
            return -1 ;
        }
        //遍历查找 
        LinkNode* pCurrent = list->head->next;
        int i = 0;
        while (pCurrent != NULL) {
            if (pCurrent->data == data) {
                break;
            }
            i++;
            pCurrent = pCurrent->next;
        }
        return i;
    
    }
    //打印链表结点
    void print_LinkList(LinkList* list, PRINTLINKNODE print) {
        if (list == NULL) {
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head->next;
        while (pCurrent != NULL) {
            print(pCurrent->data);
            pCurrent = pCurrent->next;
        }
    }
    //返回第一个结点
    void* Front_LinkList(LinkList* list) {
        return list->head->next;
    }
    //释放链表内存 
    void FreeSpace_LinkList(LinkList* list) {
        if(list==NULL){
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        while (pCurrent != NULL) {
            //缓存下一个结点
            LinkNode* pNext = pCurrent->next;
            free(pCurrent);
            pCurrent = pNext;
        }
        //释放链表内存
        list->size = 0;
        free(list);
    }
    #include"LinkList.h"
    
    
    //初始化链表
    LinkList* Init_LinkList() {
     
        LinkList* list = (LinkList*)malloc(sizeof(LinkList));
        list->size = 0;
    
        //头结点是不保存数据信息的
        list->head = malloc(sizeof(LinkNode));
        list->head->data = NULL;
        list->head->next = NULL;
        return list;
    }
    //指定位置插入
    void Insert_LinkList(LinkList* list, int pos, void* data) {
        if (list == NULL) {
            return;
        }
        if (data == NULL) {
            return;
        }
        //友好的处理,pos越界
        if (pos < 0 || list->size) {
            pos = list->size;
        }
        //创建新的结点
        LinkNode* newnode = (LinkList*)malloc(sizeof(LinkNode));
        newnode->data=data;
        newnode->next = NULL;
        //找结点
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrent = pCurrent->next;
        }
        //新结点入链表
        newnode->next = pCurrent->next;
        pCurrent->next = newnode;
    
        list->size++;
    }
    //删除指定位置的值
    void RemoveByPos_LinkList(LinkList* list, int pos) {
        if (list == NULL) {
            return;
        }
        if (pos < 0 || list->size) {
            return;
        }
        //查找删除结点的前一个结点
        LinkNode* pCurrnet = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrnet = pCurrnet->next;
        }
        //缓存删除的结点
        LinkNode* pDel = pCurrnet->next;
        pCurrnet->next = pDel->next;
        //释放删除结点的内存
        free(pDel);
        list->size--;
    }
    //获得链表的长度
    int Size_LinkList(LinkList* list) {
        return list->size;
    }
    //查找
    int Find_LinkList(LinkList*  list, void* data) {
        if (list == NULL) {
            return -1;
        }
        if (data == NULL) {
            return -1 ;
        }
        //遍历查找 
        LinkNode* pCurrent = list->head->next;
        int i = 0;
        while (pCurrent != NULL) {
            if (pCurrent->data == data) {
                break;
            }
            i++;
            pCurrent = pCurrent->next;
        }
        return i;
    
    }
    //打印链表结点
    void print_LinkList(LinkList* list, PRINTLINKNODE print) {
        if (list == NULL) {
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head->next;
        while (pCurrent != NULL) {
            print(pCurrent->data);
            pCurrent = pCurrent->next;
        }
    }
    //返回第一个结点
    void* Front_LinkList(LinkList* list) {
        return list->head->next;
    }
    //释放链表内存 
    void FreeSpace_LinkList(LinkList* list) {
        if(list==NULL){
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        while (pCurrent != NULL) {
            //缓存下一个结点
            LinkNode* pNext = pCurrent->next;
            free(pCurrent);
            pCurrent = pNext;
        }
        //释放链表内存
        list->size = 0;
        free(list);
    }
    #include"LinkList.h"
    
    
    //初始化链表
    LinkList* Init_LinkList() {
     
        LinkList* list = (LinkList*)malloc(sizeof(LinkList));
        list->size = 0;
    
        //头结点是不保存数据信息的
        list->head = malloc(sizeof(LinkNode));
        list->head->data = NULL;
        list->head->next = NULL;
        return list;
    }
    //指定位置插入
    void Insert_LinkList(LinkList* list, int pos, void* data) {
        if (list == NULL) {
            return;
        }
        if (data == NULL) {
            return;
        }
        //友好的处理,pos越界
        if (pos < 0 || list->size) {
            pos = list->size;
        }
        //创建新的结点
        LinkNode* newnode = (LinkList*)malloc(sizeof(LinkNode));
        newnode->data=data;
        newnode->next = NULL;
        //找结点
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrent = pCurrent->next;
        }
        //新结点入链表
        newnode->next = pCurrent->next;
        pCurrent->next = newnode;
    
        list->size++;
    }
    //删除指定位置的值
    void RemoveByPos_LinkList(LinkList* list, int pos) {
        if (list == NULL) {
            return;
        }
        if (pos < 0 || list->size) {
            return;
        }
        //查找删除结点的前一个结点
        LinkNode* pCurrnet = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrnet = pCurrnet->next;
        }
        //缓存删除的结点
        LinkNode* pDel = pCurrnet->next;
        pCurrnet->next = pDel->next;
        //释放删除结点的内存
        free(pDel);
        list->size--;
    }
    //获得链表的长度
    int Size_LinkList(LinkList* list) {
        return list->size;
    }
    //查找
    int Find_LinkList(LinkList*  list, void* data) {
        if (list == NULL) {
            return -1;
        }
        if (data == NULL) {
            return -1 ;
        }
        //遍历查找 
        LinkNode* pCurrent = list->head->next;
        int i = 0;
        while (pCurrent != NULL) {
            if (pCurrent->data == data) {
                break;
            }
            i++;
            pCurrent = pCurrent->next;
        }
        return i;
    
    }
    //打印链表结点
    void print_LinkList(LinkList* list, PRINTLINKNODE print) {
        if (list == NULL) {
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head->next;
        while (pCurrent != NULL) {
            print(pCurrent->data);
            pCurrent = pCurrent->next;
        }
    }
    //返回第一个结点
    void* Front_LinkList(LinkList* list) {
        return list->head->next;
    }
    //释放链表内存 
    void FreeSpace_LinkList(LinkList* list) {
        if(list==NULL){
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        while (pCurrent != NULL) {
            //缓存下一个结点
            LinkNode* pNext = pCurrent->next;
            free(pCurrent);
            pCurrent = pNext;
        }
        //释放链表内存
        list->size = 0;
        free(list);
    }
    #include"LinkList.h"
    
    
    //初始化链表
    LinkList* Init_LinkList() {
     
        LinkList* list = (LinkList*)malloc(sizeof(LinkList));
        list->size = 0;
    
        //头结点是不保存数据信息的
        list->head = malloc(sizeof(LinkNode));
        list->head->data = NULL;
        list->head->next = NULL;
        return list;
    }
    //指定位置插入
    void Insert_LinkList(LinkList* list, int pos, void* data) {
        if (list == NULL) {
            return;
        }
        if (data == NULL) {
            return;
        }
        //友好的处理,pos越界
        if (pos < 0 || list->size) {
            pos = list->size;
        }
        //创建新的结点
        LinkNode* newnode = (LinkList*)malloc(sizeof(LinkNode));
        newnode->data=data;
        newnode->next = NULL;
        //找结点
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrent = pCurrent->next;
        }
        //新结点入链表
        newnode->next = pCurrent->next;
        pCurrent->next = newnode;
    
        list->size++;
    }
    //删除指定位置的值
    void RemoveByPos_LinkList(LinkList* list, int pos) {
        if (list == NULL) {
            return;
        }
        if (pos < 0 || list->size) {
            return;
        }
        //查找删除结点的前一个结点
        LinkNode* pCurrnet = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrnet = pCurrnet->next;
        }
        //缓存删除的结点
        LinkNode* pDel = pCurrnet->next;
        pCurrnet->next = pDel->next;
        //释放删除结点的内存
        free(pDel);
        list->size--;
    }
    //获得链表的长度
    int Size_LinkList(LinkList* list) {
        return list->size;
    }
    //查找
    int Find_LinkList(LinkList*  list, void* data) {
        if (list == NULL) {
            return -1;
        }
        if (data == NULL) {
            return -1 ;
        }
        //遍历查找 
        LinkNode* pCurrent = list->head->next;
        int i = 0;
        while (pCurrent != NULL) {
            if (pCurrent->data == data) {
                break;
            }
            i++;
            pCurrent = pCurrent->next;
        }
        return i;
    
    }
    //打印链表结点
    void print_LinkList(LinkList* list, PRINTLINKNODE print) {
        if (list == NULL) {
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head->next;
        while (pCurrent != NULL) {
            print(pCurrent->data);
            pCurrent = pCurrent->next;
        }
    }
    //返回第一个结点
    void* Front_LinkList(LinkList* list) {
        return list->head->next;
    }
    //释放链表内存 
    void FreeSpace_LinkList(LinkList* list) {
        if(list==NULL){
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        while (pCurrent != NULL) {
            //缓存下一个结点
            LinkNode* pNext = pCurrent->next;
            free(pCurrent);
            pCurrent = pNext;
        }
        //释放链表内存
        list->size = 0;
        free(list);
    }
    #include"LinkList.h"
    
    
    //初始化链表
    LinkList* Init_LinkList() {
     
        LinkList* list = (LinkList*)malloc(sizeof(LinkList));
        list->size = 0;
    
        //头结点是不保存数据信息的
        list->head = malloc(sizeof(LinkNode));
        list->head->data = NULL;
        list->head->next = NULL;
        return list;
    }
    //指定位置插入
    void Insert_LinkList(LinkList* list, int pos, void* data) {
        if (list == NULL) {
            return;
        }
        if (data == NULL) {
            return;
        }
        //友好的处理,pos越界
        if (pos < 0 || list->size) {
            pos = list->size;
        }
        //创建新的结点
        LinkNode* newnode = (LinkList*)malloc(sizeof(LinkNode));
        newnode->data=data;
        newnode->next = NULL;
        //找结点
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrent = pCurrent->next;
        }
        //新结点入链表
        newnode->next = pCurrent->next;
        pCurrent->next = newnode;
    
        list->size++;
    }
    //删除指定位置的值
    void RemoveByPos_LinkList(LinkList* list, int pos) {
        if (list == NULL) {
            return;
        }
        if (pos < 0 || list->size) {
            return;
        }
        //查找删除结点的前一个结点
        LinkNode* pCurrnet = list->head;
        for (int i = 0; i < pos; i++) {
            pCurrnet = pCurrnet->next;
        }
        //缓存删除的结点
        LinkNode* pDel = pCurrnet->next;
        pCurrnet->next = pDel->next;
        //释放删除结点的内存
        free(pDel);
        list->size--;
    }
    //获得链表的长度
    int Size_LinkList(LinkList* list) {
        return list->size;
    }
    //查找
    int Find_LinkList(LinkList*  list, void* data) {
        if (list == NULL) {
            return -1;
        }
        if (data == NULL) {
            return -1 ;
        }
        //遍历查找 
        LinkNode* pCurrent = list->head->next;
        int i = 0;
        while (pCurrent != NULL) {
            if (pCurrent->data == data) {
                break;
            }
            i++;
            pCurrent = pCurrent->next;
        }
        return i;
    
    }
    //打印链表结点
    void print_LinkList(LinkList* list, PRINTLINKNODE print) {
        if (list == NULL) {
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head->next;
        while (pCurrent != NULL) {
            print(pCurrent->data);
            pCurrent = pCurrent->next;
        }
    }
    //返回第一个结点
    void* Front_LinkList(LinkList* list) {
        return list->head->next;
    }
    //释放链表内存 
    void FreeSpace_LinkList(LinkList* list) {
        if(list==NULL){
            return;
        }
        //辅助指针变量
        LinkNode* pCurrent = list->head;
        while (pCurrent != NULL) {
            //缓存下一个结点
            LinkNode* pNext = pCurrent->next;
            free(pCurrent);
            pCurrent = pNext;
        }
        //释放链表内存
        list->size = 0;
        free(list);
    }
  • 相关阅读:
    linux 静态库和动态库(共享库)的制作与使用(注意覆盖问题)转
    手机号码格式正则表达式
    项目去除TFS关联、迁移重部署
    Excel中VLOOKUP函数的用法和注意点
    自定义打赏插件
    分享一个无需注册,无次数限制的Smile聊天机器人接口
    TCP/IP
    Java字典树
    平衡二叉树结构 AVL
    二叉搜索树(二叉排序树)BST
  • 原文地址:https://www.cnblogs.com/Ssinoo/p/10932570.html
Copyright © 2011-2022 走看看