#pragma warning(disable:4996);
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
//单向链表
//链表节点数据结构
struct LinkNode
{
struct LinkNode* next;
};
//链表结构体
struct LList
{
struct LinkNode header;//头结点
int size;
};
typedef void* LinkList;
//初始化链表
struct LList* Init_LinkList()
{
struct LList* list = malloc(sizeof(struct LList));
if (list == NULL)
{
return NULL;
}
list -> header.next = NULL;
list->size = NULL;
return list;
}
void Insert_LinkList(LinkList list, int position, void* data)
{
if (list == NULL)
{
return;
}
if (data == NULL)
{
return;
}
struct LList* mylist = (struct LList*)list;
struct LinkNode* mynode = (struct LinkNode*)data;
if (position < 0 || position > mylist->size)
{
position = mylist->size;
}
//找位置,找到position的前一个位置
struct LinkNode* pCurrent = &(mylist->header);
for (int i = 0; i < position; ++i)
{
pCurrent = pCurrent->next;
}
//数据入链表
mynode->next = pCurrent->next;
pCurrent->next = mynode;
mylist->size++;
}
void Foreach_LinkList(LinkList list, void(*myforeach)(void *))
{
if (list == NULL)
{
return;
}
if (myforeach == NULL)
{
return;
}
struct LList* mylist = (struct LList*)list;
struct LinkNode *pCurrent = (mylist->header.next);
while (pCurrent != NULL)
{
myforeach(pCurrent);
pCurrent = pCurrent -> next;
}
}
void RemoveByPos_LinkList(LinkList list, int position)
{
if (list == NULL)
{
return;
}
struct LList* mylist = (struct LList*)list;
if (position<0 || position > mylist->size)
{
return;
}
//辅助指针
struct LinkNode* pCurrent = &(mylist->header);
for (int i = 0; i < position; ++i)
{
pCurrent = pCurrent->next;
}
//缓存下待删除节点
struct LinkNode* pDel = pCurrent->next;
pCurrent->next = pDel->next;
mylist->size--;
}
void Destroy_LinkList(struct LList * list)
{
if (list == NULL)
{
return;
}
free(list);
list = NULL;
}
struct Person {
struct LinkNode node;
char name[64];
int age;
};
void myPrint(void* data)
{
struct Person* person = (struct Person*)data;
printf("Name:%s, age:%d\n", person->name, person->age);
}
void test51()
{
//初始化链表
LinkList list = Init_LinkList();
//创建数据
struct Person p1 = { NULL, "aa",10 };
struct Person p2 = { NULL, "bb",11 };
struct Person p3 = { NULL, "cc",12 };
struct Person p4 = { NULL, "nn",13 };
//插入数据
Insert_LinkList(list, 0, &p1);
Insert_LinkList(list, 0, &p2);
Insert_LinkList(list, 0, &p3);
Insert_LinkList(list, 0, &p4);
//删除数据
RemoveByPos_LinkList(list, 2);
//遍历数据
Foreach_LinkList(list, myPrint);
}
int main() {
test51();
system("pause");
return 0;
}
C语言笔记---单向链表
于 2020-10-26 19:20:48 首次发布