// 单向链表.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<stdlib.h>
typedef struct LINKNODE {
void* data;
struct LINKNODE* next;
}linknode;
typedef struct LINKLIST {
LINKNODE* head;
int size;
}linklist;
//print function ptr
typedef void(*PRINTLINKNODE)(void*);
//init
linklist* Init_linklist() {
linklist* list = (linklist*)malloc(sizeof(linklist));
list->size=0;
//头节点,方便判断位置
list->head = (linknode*)malloc(sizeof(linknode));
list->head->data = NULL;
list->head->next = NULL;
return list;
}
void Insert_linklist(linklist* list, int pos, void* data) {
if (list == NULL) {
return;
}
if (data == NULL) {
return;
}
if (pos < 0 || pos > list->size) {
pos = list->size;
}
//创建新节点
linknode* newnode = (linknode*)malloc(sizeof(linknode));
newnode->data = data;
newnode->next = NULL;
//查找待插入位置 //遍历位置 //辅助指针变量
linknode* pcur = list->head;
for (int i = 0; i < pos; ++i) {
pcur = pcur->next;
}
//插入
newnode->next = pcur->next;
pcur->next = newnode;
list->size++;
}
void RemoveByPos_linklist(linklist* list, int pos) {
if (list == NULL) {
return;
}
if (pos < 0 || pos >= list->size) {
return;
}
//查找删除节点的前一个节点
linknode* pcur = list->head;
for (int i = 0; i < pos; ++i) {
pcur = pcur->next;
}
linknode* pdel = pcur->next;
pcur->next = pdel->next;
free(pdel);
list->size--;
}
void RemoveByValue_linklist(linklist* list, void* data) {
}
int Size_linklist(linklist* list) {
return list->size;
}
int Find_list(linklist* list, void* data) {
if (list == NULL) {
return -1;
}
if (data == NULL) {
return-1;
}
//遍历查找
linknode* pcur = list->head->next;
int i = 0;
while (pcur != NULL) {
if (pcur->data == data) {
break;
}
i++;
pcur = pcur->next;
}
return i;
}
//返回第一个节点
void* Front_linklist(linklist* list) {
return list->head->next->data;
}
void Free_linklist(linklist* list) {
if (list == NULL) {
return;
}
linknode* pcur = list->head;
while (pcur != NULL) {
linknode* pnext = pcur->next;
free(pcur);
pcur = pnext;//move node/ptr
}
list->size = 0;
free(list);
}
void Print_linklist(linklist* list,PRINTLINKNODE print) {
if (list == NULL) {
return;
}
//节点遍历
linknode* pcur = list->head->next;
while (pcur != NULL) {
//调用户传进来的函数
print(pcur->data);
pcur = pcur->next;
}
}
typedef struct PERSON {
char name[64];
int age;
int score;
}person;
void myprint(void* data) {
person* p = (person*)data;
printf("name:=%s,age=%d,score=%d\n", p->name, p->age, p->score);
}
int main()
{
linklist* list = Init_linklist();
person p1 = { "aaa",18,100 };
person p2 = { "bbb",19,99 };
person p3 = { "ccc",20,101 };
person p4 = { "ddd",17,97 };
person p5 = { "eee",16,59 };
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);
//打印
Print_linklist(list, myprint);
printf("-------------------------------\n");
//删除
RemoveByPos_linklist(list, 3);
Print_linklist(list, myprint);
printf("-------------------------------\n");
//返回第一个节点
person* ret =(person*)Front_linklist(list);
printf("name=%s,age=%d,score=%d\n", ret->name, ret->age, ret->score);
printf("-------------------------------\n");
//销毁
Free_linklist(list);
system("pause");
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/4408053/blog/4722947