1、功能介绍
1.1、链表结构体设计
链表节点只维护指针域,数据域,由用户给
struct Link
{
struct Link* next;
};
struct Links
{
struct Link head;
int m_size;
};
typedef void* Linklinks;
1.2、链表初始化
Linklinks init_Link(void)
{
struct Links* link = (struct Links*)malloc(sizeof(struct Links));
if(link==NULL)
return NULL;
link->head.next = NULL;
link->m_size = 0;
return link;
}
1.3、插入
struct person1
{
void* node;
char name[64];
int age;
};
void insert_Link(Linklinks list,int pos,void* data)
{
if(list==NULL||data==NULL)
return;
struct Links* mylist = (struct Links*)list;
if(pos<0||pos>mylist->m_size-1)
pos = mylist->m_size;
struct Link* mynode = (struct Link*)data;
struct Link* head = &(mylist->head);
for(int i=0;i<pos;i++)
{
head = head->next;
}
mynode->next = head->next;
head->next = mynode;
mylist->m_size++;
}
1.4、遍历
void foreach_Link(Linklinks list,void(*myfor)(void*))
{
if(list==NULL)
return;
struct Links* mylist = (struct Links*)list;
struct Link* head = mylist->head.next;
for(int i=0;i<mylist->m_size;i++)
{
myfor(head);
head = head->next;
}
}
void myPrintPerson1(void* data)
{
struct person1* p = (struct person1*)data;
printf("%s %d\n",p->name,p->age);
}
1.5、删除
void remove_Link(Linklinks list,int pos)
{
if(list==NULL)
return;
struct Links* mylist = (struct Links*)list;
if(pos<0||pos>mylist->m_size-1)
return;
struct Link* head = &(mylist->head);
for(int i=0;i<pos;i++)
{
head = head->next;
}
struct Link* temp = head->next;
head->next = temp->next;
mylist->m_size--;
}
int mycomparePerson1(void* data1,void* data2)
{
struct person1* p1 = data1;
struct person1* p2 = data2;
return strcmp(p1->name, p2->name)==0 && p1->age == p2->age;
}
void remove_Link_value(Linklinks list,void* data,int(*mycompare)(void*,void*))
{
if(list==NULL || data==NULL)
return;
struct Links* mylist = (struct Links*)list;
struct Link* head = &(mylist->head);
struct Link* head1 = mylist->head.next;
for(int i=0;i<mylist->m_size;i++)
{
if(mycompare(head1,data))
{
head->next = head1->next;
mylist->m_size--;
break;
}
head = head->next;
head1 = head1->next;
}
}
1.6、销毁
void destroy_Link(Linklinks list)
{
if(list!=NULL)
{
free(list);
}
}
2、代码
struct Link
{
struct Link* next;
};
struct Links
{
struct Link head;
int m_size;
};
typedef void* Linklinks;
Linklinks init_Link(void)
{
struct Links* link = (struct Links*)malloc(sizeof(struct Links));
if(link==NULL)
return NULL;
link->head.next = NULL;
link->m_size = 0;
return link;
}
void insert_Link(Linklinks list,int pos,void* data)
{
if(list==NULL||data==NULL)
return;
struct Links* mylist = (struct Links*)list;
if(pos<0||pos>mylist->m_size-1)
pos = mylist->m_size;
struct Link* mynode = (struct Link*)data;
struct Link* head = &(mylist->head);
for(int i=0;i<pos;i++)
{
head = head->next;
}
mynode->next = head->next;
head->next = mynode;
mylist->m_size++;
}
void foreach_Link(Linklinks list,void(*myfor)(void*))
{
if(list==NULL)
return;
struct Links* mylist = (struct Links*)list;
struct Link* head = mylist->head.next;
for(int i=0;i<mylist->m_size;i++)
{
myfor(head);
head = head->next;
}
}
struct person1
{
void* node;
char name[64];
int age;
};
void myPrintPerson1(void* data)
{
struct person1* p = (struct person1*)data;
printf("%s %d\n",p->name,p->age);
}
void remove_Link(Linklinks list,int pos)
{
if(list==NULL)
return;
struct Links* mylist = (struct Links*)list;
if(pos<0||pos>mylist->m_size-1)
return;
struct Link* head = &(mylist->head);
for(int i=0;i<pos;i++)
{
head = head->next;
}
struct Link* temp = head->next;
head->next = temp->next;
mylist->m_size--;
}
int mycomparePerson1(void* data1,void* data2)
{
struct person1* p1 = data1;
struct person1* p2 = data2;
return strcmp(p1->name, p2->name)==0 && p1->age == p2->age;
}
void remove_Link_value(Linklinks list,void* data,int(*mycompare)(void*,void*))
{
if(list==NULL || data==NULL)
return;
struct Links* mylist = (struct Links*)list;
struct Link* head = &(mylist->head);
struct Link* head1 = mylist->head.next;
for(int i=0;i<mylist->m_size;i++)
{
if(mycompare(head1,data))
{
head->next = head1->next;
mylist->m_size--;
break;
}
head = head->next;
head1 = head1->next;
}
}
void destroy_Link(Linklinks list)
{
if(list!=NULL)
{
free(list);
}
}
void test02(void)
{
Linklinks mylist = init_Link();
struct person1 p1 = {NULL,"aaa",12};
struct person1 p2 = {NULL,"bbb",52};
struct person1 p3 = {NULL,"ccc",15};
struct person1 p4 = {NULL,"ddd",32};
insert_Link(mylist, 0, &p1);
insert_Link(mylist, 0, &p2);
insert_Link(mylist, 0, &p3);
insert_Link(mylist, 0, &p4);
struct person1 p5 = {NULL,"ddd",32};
remove_Link_value(mylist,&p5,mycomparePerson1);
foreach_Link(mylist, myPrintPerson1);
}
int main(int argc, const char * argv[])
{
test02();
return 0;
}