c语言——单向链表II
参考c语言——单向链表I,但是这里少了内存管理
代码
代码写在一个文件
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//链表节点数据结构
struct LinkNode
{
struct LinkNode *next;
};
//链表结构体
struct LList
{
struct LinkNode header; //头结点
int size;
};
typedef void * LinkList;
struct Person
{
struct LinkNode node; //结构体应该指针?
char name[64];
int age;
};
初始化链表
//初始化链表
LinkList Init_LinkList()
{
struct LList *list = malloc(sizeof(struct LList));
if (NULL == list)
{
return NULL;
}
list->header.next = NULL;
list->size = 0;
return list;
}
插入节点
void Insert_LinkList(LinkList list, int position, void *data)
{
if (NULL == list)
{
return;
}
if (NULL == data)
{
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 (NULL == list)
{
return;
}
if (NULL == myforeach)
{
return;
}
struct LList * mylist = (struct LList *)list;
struct LinkNode *pCurrent = mylist->header.next;
while (pCurrent != NULL)
{
struct LinkNode *pNext = pCurrent->next;
myforeach(pCurrent);
pCurrent = pNext;
}
}
按位置删除
//按位置删除节点
void RemoveByPos_LinkList(LinkList list, int position)
{
if (NULL == list)
{
return;
}
struct LList * mylist = (struct LList *)list;
if (position < 0 || position > mylist->size - 1)
{
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(LinkList list)
{
if (NULL == list)
{
return;
}
free(list);
list = NULL;
}
测试
void myPrint(void *data)
{
struct Person *person = (struct Person *)data;
printf("Name:%s Age:%d\n", person->name,person->age);
}
void test()
{
//初始化链表
LinkList list = Init_LinkList();
//创建数据
struct Person p1 = { NULL, "aaa", 10 };
struct Person p2 = { NULL, "bbb", 20 };
struct Person p3 = { NULL, "ccc", 30 };
struct Person p4 = { NULL, "ddd", 40 };
struct Person p5 = { NULL, "eee", 50 };
struct Person p6 = { NULL, "fff", 60 };
//插入数据
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);
Insert_LinkList(list, 0, &p6);
//遍历
Foreach_LinkList(list, myPrint);
//删除
RemoveByPos_LinkList(list, 3);
printf("------------------\n");
//遍历
Foreach_LinkList(list, myPrint);
//销毁
Destroy_LinkList(list);
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}