#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
// 鏈表節點
struct LinkNode
{
struct LinkNode *next;
};
// 鏈表
struct LList
{
struct LinkNode header; //頭節點
int size;
};
typedef void * LinkList;
// 初始化鏈表
LinkList Init_LinkList()
{
struct LList *list = (struct LList *)malloc(sizeof(struct LList));
// 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 pos, void *data)
{
if (NULL == list)
{
return;
}
if (NULL == data)
{
return;
}
struct LList *mylist = (struct LList *)list;
// 數據只取前四個節點
struct LinkNode *mynode = (struct LinkNode *)data;
if (pos < 0 || pos > mylist->size)
{
pos = mylist->size;
}
struct LinkNode *pCurrent = &(mylist->header);
for (int i = 0; i < pos; 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 pos)
{
if (NULL == list)
{
return;
}
struct LList *mylist = (struct LList *)list;
if (pos < 0 || pos > mylist->size -1)
{
return;
}
// 輔助指針
struct LinkNode *pCurrent = &(mylist->header);
for (int i = 0; i < pos; i++)
{
pCurrent = pCurrent->next;
}
// 緩存下一個待刪除的節點
struct LinkNode *pDel = pCurrent->next;
// 重新建立待刪除節點的前驅和後繼節點關係
pCurrent->next = pDel->next;
mylist->size--;
}
// 銷燬鏈表
void Destory_LinkList(LinkList *list)
{
if (NULL == list)
{
return;
}
free(*list);
*list = NULL;
}
struct Person
{
/*
包含的linknode 應該是一個指針,如果是結構體的話,當linknode 裏面 不單單隻有一個指針的話,那麼就會出現問題
*/
struct linknode *node;
char name[64];
int age;
};
void myPrint(void *data)
{
struct Person *p = (struct Person *)data;
printf("Name : %s Age : %d \n", p->name, p->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, 1);
printf("------------------------\n");
Foreach_LinkList(list, myPrint);
Destory_LinkList(&list);
printf("------------------------\n");
Foreach_LinkList(&list, myPrint);
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
單向鏈表_版本二
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.