鏈表C語言實現

/*
 * LinkList.h
 *
 *  Created on: 2019年7月20日
 *      Author: Administrator
 */

#ifndef SRC_LINKLIST_H_
#define SRC_LINKLIST_H_

#include<stdlib.h>
#include<stdio.h>


//鏈表節點
typedef struct LINKNODE {
    void *data;
    struct LINKNODE *next;
} LinkNode;

//鏈表結構體
typedef struct LINKLIST {
    LinkNode *head;
    int size;
}LinkList;

//打印函數指針
typedef void(*PRINTLINKNODE)(void *);

//初始化鏈表
LinkList * Init_LinkList();
//在指定位置插入
void Insert_LinkList(LinkList *list, int pos, void *data);

//刪除指定位置的值
void RemoveByPos_LinkList(LinkList *list, int pos);

//得到鏈表的長度
int Size_LinkList(LinkList *list);

//查找
int Find_LinkList(LinkList *list, void* data);

//打印鏈表節點
void Print_LinkList(LinkList *list, PRINTLINKNODE print);

// 返回第一個節點
void *Front_LinkList(LinkList *list);

// 釋放鏈表
void FreeSpace_LinkList(LinkList *list);



#endif /* SRC_LINKLIST_H_ */
/*
 * LinkList.c
 *
 *  Created on: 2019年7月20日
 *      Author: Administrator
 */

#include "LinkList.h"

//初始化鏈表
LinkList * Init_LinkList() {
    LinkList *list = (LinkList*)malloc(sizeof(LinkList));
    list->size = 0;

    //頭節點 是不保存數據信息的
    list->head = (LinkNode *)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;
    }

    //安全驗證
    if(pos < 0 || pos > list->size) {
        pos = list->size;
    }

    //建立新的節點
    LinkNode *newnode = (LinkNode *)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 || pos >= list->size){
        return;
    }

    //查找刪除節點的前一個節點
    LinkNode *pCurrent = list->head;
    for(int i = 0; i< pos; i++) {
        pCurrent = pCurrent->next;
    }

    //刪除節點
    LinkNode *pDel = pCurrent->next;
    pCurrent->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->data;
}

// 釋放鏈表
void FreeSpace_LinkList(LinkList *list) {
    if(list == NULL){
        return;
    }

    //輔助指針變量
    LinkNode *pCurrent = list->head;
    while(pCurrent != NULL){
        //先緩衝下一個節點
        LinkNode *pNext = pCurrent->next;
        free(pCurrent);
        pCurrent = pNext;
    }

    //釋放鏈表自己
    free(list);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "LinkList.h"

typedef struct PERSON {
    char name[64];
    int age;
    int score;
} Person;

//打印函數
void MyPrint(void* data){
    Person *p = (Person *)data;
    printf("Name: %s Age: %d Score:%d \n", p->name, p->age, p->score);
}

int main(){
    printf("link list test! \n");
     //建立鏈表
    LinkList *list = Init_LinkList();

    //建立數據
    Person p1 = {"jarvis",18,100};
    Person p2 = {"zhangsan",19,99};
    Person p3 = {"lishi",18,100};
    Person p4 = {"wangwu",23,70};
    Person p5 = {"zhaoliu",18,100};

    //數據插入
    Insert_LinkList(list, 0, &p1);
    Insert_LinkList(list, 0, &p2);
    Insert_LinkList(list, 0, &p3);
    Insert_LinkList(list, 0, &p4);
    Insert_LinkList(list, 0, &p5);

    printf("--------------------\n");
    //打印
    Print_LinkList(list, MyPrint);

    printf("--------------------\n");
    printf("返回第一個結點\n");

    //返回第一個結點
    Person *ret = (Person*)Front_LinkList(list);
    printf("Name: %s Age: %d Score:%d \n", ret->name, ret->age, ret->score);

    //銷燬鏈表
    FreeSpace_LinkList(list);

    system("pause");

    return 0;
}
相關文章
相關標籤/搜索