通用简单版 单链表

main.c 文件

#include "stdlib.h"
#include "LinkList.h"
#include "stdio.h"


typedef struct Teacher
{

    LinkListNode node;
    int age;
}Teacher;


void main()
{

    Teacher t1, t2, t3;
    t1.age = 10;
    t2.age = 20;
    t3.age = 30;

    LinkList * list = NULL;
    list = LinkList_Create();
    LinkList_Insert(list, &t1, LinkList_Length(list));
    LinkList_Insert(list, &t2, LinkList_Length(list));
    LinkList_Insert(list, &t3, LinkList_Length(list));


    for (int i = 0; i < LinkList_Length(list);i++)
    {
        Teacher *temp = (Teacher *)LinkList_GetPos(list, i);
        if (temp!=NULL)
        {
            printf("age:%d \n", temp->age);
        }
    }

    while (LinkList_Length(list)>0)
    {
        Teacher *temp = (Teacher *)LinkList_Delete(list, 0);
        if (temp != NULL)
        {
            printf("age:%d \n", temp->age);
        }

    }

    system("pause");

}

LinkList.h

#pragma once
//2016年11月26日 18:14:40
//链表通用库
// create by [email protected]
//通用头文件




typedef void LinkList;

typedef struct st_LinkList
{
    struct st_LinkList *next;

}LinkListNode;


//创建链表
LinkList *LinkList_Create();

//销毁
void LinkList_Destroy(LinkList *list);

//清空元素
void LinkList_Clear(LinkList *list);

//返回一个链表中所有的元素
unsigned int LinkList_Length(LinkList *list);

//在链表的pos 位置插入一个新元素 //成功返回插入的元素,失败返回NUll
LinkListNode * LinkList_Insert(LinkList *List, LinkListNode *node, unsigned int pos);

//获取链表某个位置的元素
LinkListNode *LinkList_GetPos(LinkList *list, unsigned pos);

//删除一个元素
LinkListNode *LinkList_Delete(LinkList *list, unsigned int pos);

#include "LinkList.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//实现 代码


typedef struct _Link_List
{

    LinkListNode   header; //相当于一个next指针
    unsigned int length;    //长度

}TLinkList;

//创建
LinkList * LinkList_Create()
{
    TLinkList *list = (TLinkList *)malloc(sizeof(TLinkList));
    if (list ==NULL)
    {
        return NULL;
    }
    memset(list, 0, sizeof(TLinkList));
    list->header.next = NULL;
    list->length = 0;
    return list;
}

void LinkList_Destroy(LinkList *list)
{
    if (list!=NULL)
    {
        TLinkList *ret = (TLinkList*)list;
        if (ret !=NULL)
        {
            free(ret);
        }
    }
}

void LinkList_Clear(LinkList *list)
{

    if (list != NULL)
    {
        TLinkList *ret = (TLinkList*)list;
        if (ret != NULL)
        {
            ret->header.next = NULL;
            ret->length = 0;
        }
    }
}

unsigned int LinkList_Length(LinkList *list)
{
    if (list != NULL)
    {
        TLinkList *ret = (TLinkList*)list;
        if (ret != NULL)
        {
            return ret->length;
        }
    }
}

//插入一个元素
//插入比较重要
//注释我会写详细
LinkListNode * LinkList_Insert(LinkList *list, LinkListNode *node, unsigned int pos)
{

    TLinkList *List = (TLinkList *)list;

    if (list == NULL || node == NULL)
    {
        return NULL;
    }
    //把头结点记录下来
    LinkListNode *current = &List->header;
    //把小标移到需要插入的节点
    // current->next != NULL   这句话意思就是已经移到最后了不能在移动了
    for (int i = 0; i < pos && current->next != NULL;++i)
    {
        //依次 把指针往后移动
        current = current->next;
    }
    //开始插入节点
    //把当前节点的后一个节点。。连接到插入节点的后面也就是
     node->next = current->next;
     //然后自己的后面的节点已经给node->next了。自己的next 需要重新指定
    current->next = node;
    List->length++;
    //成功返回
    return node;
}



//查找第三个元素的时候 其实只需要找到第二个位置,因为里面的next指向了第三个节点
LinkListNode * LinkList_GetPos(LinkList *list, unsigned pos)
{
    TLinkList *List = (TLinkList *)list;

    if (list == NULL)
    {
        return NULL;
    }
    //把头结点记录下来
    LinkListNode *current = &List->header;
    //把小标移到需要插入的节点
    // current->next != NULL   这句话意思就是已经移到最后了不能在移动了
    for (int i = 0; i < pos && current->next != NULL; ++i)
    {
        //依次 把指针往后移动
        current = current->next;
    }
    return current->next;

}
//和插入大概是一个流程

LinkListNode * LinkList_Delete(LinkList *list, unsigned int pos)
{

    TLinkList *List = (TLinkList *)list;
    LinkListNode *deleteNode = NULL;
    if (list == NULL  || pos>= List->length)
    {
        return NULL;
    }
    //把头结点记录下来
    LinkListNode *current = &List->header;

    //把小标移到需要插入的节点
    // current->next != NULL   这句话意思就是已经移到最后了不能在移动了
    for (int i = 0; i < pos && current->next != NULL; ++i)
    {
        //依次 把指针往后移动
        current = current->next;
    }

    deleteNode = current->next;

    current->next = deleteNode->next;
    List->length--;

    return deleteNode;

}

总觉得 删除函数有点问题.希望大神们指出。谢谢。

你可能感兴趣的:(数据结构)