数据结构:单链表(四)

来源:互联网 发布:淘宝笔记本排行榜 编辑:程序博客网 时间: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
原创粉丝点击