链表模型
只将前四个字节用来作为指针域,并且只对指针域进行操作即可,并不会对数据进行操作。
链表代码实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct LinkNode {
struct LinkNode* next;
};
struct LinkList {
int m_size;
struct LinkNode pHeader;
};
typedef void* LList;
LList init_LinkList() {
struct LinkList* myList = malloc(sizeof(struct LinkList));
if (myList == NULL)
return NULL;
myList->m_size = 0;
myList->pHeader.next = NULL;
return myList;
}
void insert_LinkList(LList list, int pos, void* data) {
if (list == NULL || data == NULL)
return;
struct LinkList* myList = list;
if (pos < 0 || pos > myList->m_size-1)
{
pos = myList->m_size;
}
struct LinkNode* myNode = data;
struct LinkNode* pCurrent = &myList->pHeader;
for (int i = 0; i < pos; i++) {
pCurrent = pCurrent->next;
}
myNode->next = pCurrent->next;
pCurrent->next = myNode;
myList->m_size++;
}
void for_each_LinkList(LList list, void(*myPrint)(void* data)) {
if (list == NULL)
return;
struct LinkList* myList = list;
struct LinkNode* pCurrent = myList->pHeader.next;
for (int i = 0; i < myList->m_size; i++) {
myPrint(pCurrent);
pCurrent = pCurrent->next;
}
}
void delete_by_pos(LList list, int pos) {
if (list == NULL)
return;
struct LinkList* myList = list;
if (pos < 0 || pos >= myList->m_size)
return;
struct LinkNode* myNode = &myList->pHeader;
for (int i = 0; i < pos; i++)
{
myNode = myNode->next;
}
struct LinkNode* delNode = myNode->next;
myNode->next = delNode->next;
myList->m_size--;
}
void destroy_LinkList(LList list) {
if (list == NULL)
return;
struct LinkList* myList = list;
myList->m_size = 0;
myList->pHeader.next = NULL;
free(list);
list = NULL;
}
typedef struct Person {
void* node;
char name[64];
int age;
}Person;
void myPrint(void* data) {
Person* p = data;
printf("姓名:%s, 年龄:%d\n", p->name, p->age);
}
void test01() {
Person p1 = { NULL, "bobo",23 };
Person p2 = { NULL, "hoho",24 };
Person p3 = { NULL, "toto",25 };
Person p4 = { NULL, "yoyo",26 };
struct LinkList* myList = init_LinkList();
insert_LinkList(myList, 0, &p1);
insert_LinkList(myList, 1, &p2);
insert_LinkList(myList, 0, &p3);
insert_LinkList(myList, 2, &p4);
for_each_LinkList(myList, myPrint);
delete_by_pos(myList, 3);
printf("++++++++++++++++++++++++++\n");
for_each_LinkList(myList, myPrint);
destroy_LinkList(myList);
myList = NULL;
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}