1. 实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include "LinkList.h"
using namespace std;
typedef struct PERSON
{
char name[64];
int age;
int score;
}Person;
void MyPrint(void* data) {
Person* p = (Person*)data;
cout << "Name=" << p->name << " " << "age=" << p->age << " " << "Score=" << p->score << endl;
}
int main(void) {
LinkList* list = Init_LinkList();
Person p1 = { "aaa",18,100 };
Person p2 = { "bbb",17,100 };
Person p3 = { "ccc",16,100 };
Person p4 = { "ddd",15,100 };
Person p5 = { "eee",14,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);
Print_LinkList(list, MyPrint);
RemoveByPos_LinkList(list,3);
Person* ret=(Person*)Front_LinkList(list);
cout << "pName=" << ret->name << " " << "page=" << ret->age << " " << "pScore=" << ret->score << endl;
FreeSpace_LinkList(list);
system("pause");
return 0;
}
2. 头文件和函数实现
#pragma once
#ifndef LINKLIST_H
#define LINKLIST_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* Front_LinkList(LinkList* list);
void Print_LinkList(LinkList* list, PRINTLINKNODE print);
void FreeSpace_LinkList(LinkList* list);
#endif
#include <iostream>
#include"LinkList.h"
#include <stdlib.h>
#include <stdio.h>
using namespace std;
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* Front_LinkList(LinkList* list) {
return list->head->next->data;
}
void Print_LinkList(LinkList* list, PRINTLINKNODE print) {
if (list == NULL)
return;
LinkNode* pCurrent = list->head->next;
while (pCurrent != NULL) {
cout << pCurrent->data << endl;
pCurrent = pCurrent->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);
}