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);
}
原文地址:https://www.cnblogs.com/Ssinoo/p/10932570.html