数据结构:单链表(四)
来源:互联网 发布:淘宝笔记本排行榜 编辑:程序博客网 时间:2024/06/07 01:51
/*********************************************************说明:结构体嵌套结构体*******************************************************//*************** LinkList.h *****************/#pragma once#include<stdio.h>#include<stdlib.h>typedef void* LinkList;/***定义链表节点的数据类型***/struct LinkNode { void *data; struct LinkNode *next; };struct LList { struct LinkNode header; //头结点 int size; //链表大小 };/****为了C++中调用此函数****/#ifdef __cplusplusextern "C"{#endif /************链表初始化************/ LinkList Init_LinkList(); /************链表插入************/ void Insert_LinkList(LinkList list, int pos,void *data); /************链表删除元素************/ void Remove_LinkList(LinkList list, int pos); /************链表遍历************/ void Foreach_LinkList(LinkList list, void(*myforeach)(void *)); /************链表销毁************/ void Destroy_LinkList(LinkList list); /************链表大小************/ void Size_LinkList(LinkList list);#ifdef __cplusplus }#endif/*************** LinkList.c *****************/#include "LinkList.h" /************链表初始化************/LinkList Init_LinkList() { struct LList *mPtr = NULL; mPtr = (struct LList *)malloc (sizeof(struct LList)); mPtr->header.data = NULL; mPtr->header.next=NULL; mPtr->size = 0; return mPtr; } /************链表插入************/void Insert_LinkList(LinkList list, int pos,void *data) { struct LList *mPtr = NULL; /*新节点数据指针*/ struct LinkNode *mPdata = NULL; int i = 0; //辅助插入元素时候的指针 struct LinkNode *mPcur = NULL; mPtr = (struct LList *)list; if (NULL == list) { return; } if (pos <0 ||pos > mPtr->size) { pos = mPtr->size; } mPcur = &(mPtr->header); for (i=0;i<pos;i++) { mPcur = mPcur->next; } /*创建一个新节点,并且为其分配内存空间*/ mPdata = (struct LinkNode*)malloc (sizeof(struct LinkNode)); mPdata->data=data; mPdata->next = NULL; /*新节点入链,修改指针的指向*/ mPdata->next = mPcur->next; mPcur->next = mPdata; mPtr->size++; return; }/************链表删除元素************/void Remove_LinkList(LinkList list, int pos) { int i; struct LList *mPtr = NULL; struct LinkNode *mPcur = NULL; /***辅助指针***/ struct LinkNode *mPdel = NULL; mPtr = (struct LList *)list; if (NULL == list) { return; } if (pos < 0 || pos > mPtr->size-1) { return; } if (mPtr->size == 0) { return; } mPcur = mPtr->header.next; i=0; while (i<pos) { mPcur = mPcur->next; i++; } mPdel = mPcur->next; mPcur->next = mPdel->next; free (mPdel); mPdel=NULL; return; }/************链表遍历************/void Foreach_LinkList(LinkList list, void(*myPonit)(void *)) { struct LList *mPtr = NULL; struct LinkNode *mPcur = NULL; if (NULL == list||NULL == myPonit) { return; } mPtr = (struct LList*)list; mPcur = mPtr->header.next; while (mPcur!=NULL) { myPonit(mPcur->data); mPcur = mPcur->next; } return; }/************链表销毁************/void Destroy_LinkList(LinkList list) { struct LList *mPtr = NULL; struct LinkNode *mPcur = NULL; struct LinkNode *mPdel = NULL; mPtr = (struct LList *)list; if (NULL == list) { return; } mPcur = mPtr->header.next; while(!mPtr) { /***先缓存当前节点的下一个节点***/ mPdel = mPcur->next; /***释放当前节点的内存***/ free (mPcur); mPcur = NULL; mPcur = mPdel; } free (mPtr); mPtr = NULL; return; }/************链表大小************/void Size_LinkList(LinkList list) { struct LList *mPtr = NULL; mPtr = (struct LList *)list; if (NULL == list) { return; } printf ("LinkSize = %d\n",mPtr->size); return; }/***************** test.c *******************/#include"LinkList.h"struct Person { char name[64]; int age; };/**** Functon: 打印链表数据 ****/void myPrint(void* data) { struct Person *person = (struct Person *)data; printf("Name: %s\tAge: %d\n", person->name, person->age); }void test() { //测试数据 struct Person p1 = { "aaa", 10 }; struct Person p2 = { "bbb", 20 }; struct Person p3 = { "ccc", 30 }; struct Person p4 = { "ddd", 40 }; struct Person p5 = { "eee", 50 }; struct Person p6 = { "fff", 60 }; /*** 创建链表 ***/ LinkList list = Init_LinkList(); /*** 插入数据 ***/ 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); /*** 获取链栈的大小 ***/ Size_LinkList(list); Foreach_LinkList(list, myPrint); /*** 删除数据 ***/ Remove_LinkList(list, 0); printf("-------------\n"); Foreach_LinkList(list, myPrint); printf("-------------\n"); Foreach_LinkList(list, myPrint); /*** 销毁链表 ***/ Destroy_LinkList(list); }int main(){ test(); system("pause"); return EXIT_SUCCESS; }
0 0
- 数据结构:单链表(四)
- 数据结构(四)
- 数据结构复习题(四)
- 数据结构(四):栈
- [数据结构]查找(四)
- 数据结构(四) 串
- 数据结构(四)
- 数据结构学习(四)
- 无锁数据结构(四)
- Ruby操纵数据结构(四)
- 数据结构树习题(四)
- 《大话数据结构》读书笔记(四)
- C++ 动态数据结构(四)
- 数据结构小结 (四) 串
- 数据结构之栈(四)
- 数据结构之队列(四)
- 数据结构学习笔记(四)
- 数据结构(四) -- 二叉树
- 可变参数列表源码的剖析
- linux基础小知识(2)--语句
- 追忆计算机之父艾伦图灵:在一个时刻两次改变历史的人
- 集电极开路
- Android自定义开关
- 数据结构:单链表(四)
- C# WinForm控件之Dock先后顺序调整
- VS2010使用大漠插件
- C++ string类中的字符串查找
- 对AsyncTask的深入了解
- 用Java实现计算器
- spring7
- C++远征之封装篇——常对象成员、常成员函数
- PAT-A-1038. Recover the Smallest Number (30)