|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 zhenhaowa66 于 2021-11-2 11:28 编辑
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<string.h>
//节点的结构体
struct LinkNode {
void* data;
struct LinkNode* next;
};
//链表的结构体
struct LList {
//头节点
struct LinkNode pHead;
//链表长度
int M_Size;
};
//测试数据结构
struct Person {
char name[32];
int age;
};
//void* 别名
typedef void* LinkList;
//初始化链表
LinkList init_Linklist(void);
//遍历链表
void foreach_LinkList(LinkList list,void(*myPrint)(void*));
//按位置删除链表数据
void removeByPos_LinkList(LinkList list, int pos);
//按对比值删除链表数据
void removeByValue_LinkList(LinkList list, void* data, int(*myCompare_LinkList)(void*, void*));
//测试函数
void test01(void);
#include"mybook.h"
//打印输出回调函数
void myPrint(void* mylist) {
struct Person* pdata = mylist;
printf("姓名: %s 年龄: %d\n", pdata->name, pdata->age);
}
//数据对比回调函数
int myCompare_LinkList(void* data1, void* data2) {
struct Person* p1 = data1;
struct Person* p2 = data2;
return (strcmp(p1, p2) == 0 && p1->age == p2->age);
}
//初始化链表
LinkList init_Linklist() {
struct LList* mylist = malloc(sizeof(struct LList));
if (mylist == NULL) {
return NULL;
}
//给头节点属性初始化
mylist->pHead.data = 0;
mylist->pHead.next = NULL;
mylist->M_Size = 0;
return mylist;
}
//插入节点
void insert_LinkList(LinkList list,int pos,void* date) {
if (list == NULL || date == NULL) {
return NULL;
}
struct LList* mylist = list;
if (mylist->M_Size < pos || pos < 0) {
pos = mylist->M_Size;
}
//创建临时节点,通过循环找到待插入位置的前驱节点的位置
struct LinkNode* pCurent = &mylist->pHead;
for (int i = 0; i < pos; i++) {
pCurent = pCurent->next;
}
//找到插入位置的前驱节点,创建新的节点
struct LinkNode* newNode = malloc(sizeof(struct LinkNode));
newNode->data = date;
newNode->next = NULL;
//插入连接
newNode->next = pCurent->next;
pCurent->next = newNode;
//更新链表长度
mylist->M_Size++;
}
//遍历链表
void foreach_LinkList(LinkList list,void(*myPrint)(void*)){
if (list == NULL) {
return NULL;
}
//还原链表真实结构体
struct LList* mylist = list;
struct LinkNode* pCurent = mylist->pHead.next;
for (int i = 0; i < mylist->M_Size; i++) {
myPrint(pCurent->data);
pCurent = pCurent->next;
}
}
//按位置删除链表数据
void removeByPos_LinkList(LinkList list, int pos) {
struct LList* mylist = list;
if (mylist->pHead.next == NULL || pos > mylist->M_Size || pos < 1){
return NULL;
}
struct LinkNode* phead = &mylist->pHead;
struct LinkNode* ptemp = phead;
for (int i = 1; i <= pos; i++) {
ptemp = ptemp->next;
if(i>1)
phead = phead->next;
}
phead->next = ptemp->next;
free(ptemp);
ptemp = NULL;
mylist->M_Size--;
}
//按值删除链表数据
void removeByValue_LinkList(LinkList list,void* data, int(*myCompare_LinkList)(void*,void*)) {
if (list == NULL || data == NULL) {
return NULL;
}
struct LList* mylist = list;
struct LinkNode* phead = &mylist->pHead;
struct LinkNode* ptemp = phead;
for (int i = 0; i <= mylist->M_Size; i++) {
ptemp = ptemp->next;
if (i >= 1)
phead = phead->next;
if (myCompare_LinkList(ptemp->data ,data)){
phead->next = ptemp->next;
free(ptemp);
ptemp = NULL;
break;
}
}
mylist->M_Size--;
}
//测试链表
void test01() {
LinkList mylist = init_Linklist();
struct LList* mydata = mylist;
printf("链表现在有%d个节点!\n",mydata->M_Size );
printf("----------------------------------------\n");
struct Person p1 = { "刘备",25 };
struct Person p2 = { "关羽",24 };
struct Person p3 = { "张飞",23 };
struct Person p4 = { "赵云",20 };
struct Person p5 = { "马超",21 };
struct Person p6 = { "黄忠",26 };
struct Person p7 = { "诸葛亮",26 };
struct Person p8 = { "魏延",22 };
insert_LinkList(mylist, -1, &p1);
insert_LinkList(mylist, 1, &p2);
insert_LinkList(mylist, 2, &p3);
insert_LinkList(mylist, 8, &p4);
insert_LinkList(mylist, -3, &p5);
insert_LinkList(mylist, 8, &p6);
insert_LinkList(mylist, 1, &p7);
insert_LinkList(mylist, 10, &p8);
foreach_LinkList(mylist, myPrint);
printf("链表现在有%d个节点!\n", mydata->M_Size);
printf("----------------------------------------\n");
removeByPos_LinkList(mylist, 2);
foreach_LinkList(mylist, myPrint);
printf("链表现在有%d个节点!\n", mydata->M_Size);
printf("----------------------------------------\n");
struct Person p = { "马超",21 };
removeByValue_LinkList(mylist, &p, myCompare_LinkList);
foreach_LinkList(mylist, myPrint);
printf("链表现在有%d个节点!\n", mydata->M_Size);
printf("----------------------------------------\n");
}
#include"mybook.h"
int main(){
test01();
return 0;
}
下面是运行结果;
链表现在有0个节点!
----------------------------------------
姓名: 刘备 年龄: 25
姓名: 诸葛亮 年龄: 26
姓名: 关羽 年龄: 24
姓名: 张飞 年龄: 23
姓名: 赵云 年龄: 20
姓名: 马超 年龄: 21
姓名: 黄忠 年龄: 26
姓名: 魏延 年龄: 22
链表现在有8个节点!
----------------------------------------
姓名: 刘备 年龄: 25
姓名: 关羽 年龄: 24
姓名: 张飞 年龄: 23
姓名: 赵云 年龄: 20
姓名: 马超 年龄: 21
姓名: 黄忠 年龄: 26
姓名: 魏延 年龄: 22
链表现在有7个节点!
----------------------------------------
姓名: 刘备 年龄: 25
姓名: 关羽 年龄: 24
姓名: 张飞 年龄: 23
姓名: 赵云 年龄: 20
姓名: 黄忠 年龄: 26
姓名: 魏延 年龄: 22
链表现在有6个节点!
----------------------------------------
D:\C-language\Clanguage\lian xi ce\Project1\Project1\Debug\Project1.exe (进程 5392)已退出
,代码为 0。
按任意键关闭此窗口. . .
现在修改好了没有问题了 |
|