
注意插入和删除的时候的pos
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct LinkNode {
LinkNode* next;
};
struct LList {
LinkNode pHeader;
int size;
};
typedef void* LinkList;
LinkList init_LinkList()
{
struct LList* mylist = (LList*)malloc(sizeof(LList));
if (mylist == NULL)
return NULL;
mylist->pHeader.next = NULL;
mylist->size = 0;
return mylist;
}
void insert_LinkList(LinkList list,int pos,void* data)
{
if (list == NULL)
return;
struct LList* mylist = (LList*)list;
if (pos<0 || pos>mylist->size)
{
pos = mylist->size;
}
LinkNode* curNode = &mylist->pHeader;
for(int i = 0; i < pos; i++)
{
curNode = curNode->next;
}
struct LinkNode* newNode = (LinkNode*)data;
newNode->next = NULL;
newNode->next = curNode->next;
curNode->next = newNode;
mylist->size++;
}
void foreach_LinkList(LinkList list,void(*print)(void*))
{
if (list == NULL)
return;
if (print == NULL)
return;
LList* mylist = (LList*)list;
LinkNode* curNode = mylist->pHeader.next;
while (curNode)
{
print(curNode);
curNode = curNode->next;
}
}
void del_LinkList(LinkList mylist, int pos)
{
if (mylist == NULL)
return;
LList* list = (LList*)mylist;
if (pos<0 || pos>=list->size)
return;
LinkNode* curNode = &list->pHeader;
for (int i = 0; i <pos; i++)
{
curNode = curNode->next;
}
LinkNode* delNode = curNode->next;
curNode->next = delNode->next;
list->size--;
}
void del_LinkList(LinkList mylist,void* data,int(*compare)(void*,void*))
{
if (mylist == NULL)
return;
if (data == NULL)
return;
LList* list =(LList*)mylist;
LinkNode* curNode = &list->pHeader;
for (int i = 0; i < list->size; i++)
{
curNode = curNode->next;
if (compare(curNode, data))
{
del_LinkList(list, i);
}
}
}
void clear_List(LinkList list)
{
if (list == NULL)
return;
LList* mylist = (LList*)list;
mylist->pHeader.next = NULL;
mylist->size = 0;
}
int size_List(LinkList list)
{
if (list == NULL)
return NULL;
LList* mylist = (LList*)list;
return mylist->size;
}
void destory_List(LinkList list)
{
if (list == NULL)
return;
free(list);
list == NULL;
}
struct person
{
void* data;
char name[32];
int age;
};
void print(void* val)
{
person* p = (person*)val;
printf("姓名:%s\t年龄:%d\n", p->name, p->age);
}
int compare(void* v1, void* v2)
{
person* p1 = (person*)v1;
person* p2 = (person*)v2;
if (p1->age == p2->age && strcmp(p1->name, p2->name)==0)
{
return 1;
}
return 0;
}
int main()
{
LinkList list = init_LinkList();
person p1 = {
NULL,"大忽悠",19 };
person p2 = {
NULL,"like",18 };
person p3 = {
NULL,"小朋友",19 };
insert_LinkList(list, 0,&p1);
insert_LinkList(list, -1, &p2);
insert_LinkList(list, 10, &p3);
printf("打印链表结果如下:\n");
foreach_LinkList(list, print);
printf("\n按位置删除链表后:\n");
del_LinkList(list,2);
foreach_LinkList(list, print);
printf("\n按值删除链表后:\n");
del_LinkList(list, &p1, compare);
foreach_LinkList(list, print);
printf("\n链表的长度:%d\n", size_List(list));
clear_List(list);
printf("清空链表结果如下:\n");
foreach_LinkList(list, print);
printf("\n链表的长度:%d\n", size_List(list));
destory_List(list);
printf("\n链表的长度:%d\n", size_List(list));
return 0;
}
