C语言 数据结构单链表(未解决版)

头文件

#ifndef LINKLIST_H
#define LINKLIST_H

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

//链表结点
typedef struct LINKNODE {
    void* data; //指向任何类型的数据
    struct LINKENODE* 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);
#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) {

}
//查找
int Find_LinkList(LinkList* list, void* data) {
    if (list == NULL) {
        return;
    }
    if (data == NULL) {
        return;
    }
    //遍历查找 
    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);
}

 

#define _CRT_SECURE_NO_WARNINGS

#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
", p->name, p->age, p->score);
}
int main(void) {
    //创建一个链表
    LinkList* list = Init_LinkList();

    //创建数据
    Person  p1 = { "aaa",18,100 };
    Person  p2 = { "bbb",19,90 };
    Person  p3= { "ccc",20,80 };
    Person  p4 = { "ddd",21,60 };
    //数据插入链表
    Insert_LinkList(list ,0, &p1);
    Insert_LinkList(list ,0, &p2);
    Insert_LinkList(list ,0, &p3);
    Insert_LinkList(list ,0, &p4);
    //打印
    Print_LinkList(list, MyPrint);
    //销毁链表
    FreeSpace_LinkList(list);
    printf("
");
    system("pause");
    return 0;
}

跟着视频教学打的,还有17个报错没解决QAQ,正在解决ing~

原文地址:https://www.cnblogs.com/Ssinoo/p/10919101.html