zoukankan      html  css  js  c++  java
  • 链式链表的C风格实现

    头文件:

    #ifndef _LINKLIST_H_
    #define _LINKLIST_H_
     
    typedef void LinkList; //将数据的类型分离,相当于句柄
     
    //只是一个小节点 包含着位置信息!
    typedef struct _tag_LinkListNode
    {
        struct _tag_LinkListNode* next;
    }LinkListNode;
     
    //生成一个链表
    LinkList* LinkList_Create();
    //删除一个链表
    void LinkList_Destory(LinkList* list);
    //清空一个链表
    void LinkList_Clear(LinkList* list);
    //链表长度
    int LinkList_Length(LinkList* list);
    //在某个位置插入一个节点
    int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
    //获取某个位置的节点
    LinkListNode* LinkList_Get(LinkList* list, int pos);
    //删除某个位置的节点
    LinkListNode* LinkList_Delete(LinkList* list, int pos);
     
    #endif

    CPP文件:

    #include "linkList.h"
    #include <iostream>
    using namespace std;
     
     
    //定义一个链表头
    typedef struct _tag_LinkList
    {
        LinkListNode header;    //定义一个头结点
        int length;
     
    }tagList;
     
     
    //生成一个链表
    LinkList* LinkList_Create()
    {
        tagList * ret = NULL;
        ret = (tagList *)malloc(sizeof(tagList));  //分配内存
        memset(ret, 0, sizeof(tagList));            //memset快速填充
     
        ret->header.next = NULL;              //头结点的Next指向NULL
        ret->length = 0;
        return ret;
    }
    //删除一个链表
    void LinkList_Destory(LinkList* list)
    {
        //异常处理
        if (list != NULL)
        {
            free(list);
            list = NULL;
        }
        return;
    }
    //清空一个链表
    void LinkList_Clear(LinkList* list)
    {
        tagList *tList = NULL;
     
        if(list == NULL)
        {
            cout << "LinkList_Clear Err" << endl;
            return;
        }
     
        tList = (tagList *)list;
     
        tList->length = 0;
        tList->header.next = NULL;
        return;
    }
    //链表长度
    int LinkList_Length(LinkList* list)
    {
        tagList *tList = NULL;
     
        if(list == NULL)
        {
            cout << "LinkList_Length Err" << endl;
            return -1;
        }
     
        tList = (tagList *)list;
     
        return tList->length;
    }
    //在某个位置插入一个节点
     
    //链表是单向的 POS位置保存在POS-1的NEXT域里面
     
    int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
    {
        int ret = 0;
     
        LinkListNode* current = NULL;      //定义辅助指针变量Current 
     
        tagList* tList;
        if (list == NULL || node == NULL || pos <0)
        {
            ret = -1;
            cout << "Insert Err" << endl;
            return ret;
        }
     
        tList = (tagList*)list;
     
        current = &(tList->header);            //Current首先指向头结点
     
        for(int i = 0; ((i < pos) && (current->next !=NULL)); i++)
        {
            current = current->next;         //指向POS节点的前一个位置
        }
     
        //node的NEXT改变 将Current的NEXT域的信息存入node的NEXT域
        node->next = current->next;
        //Current的NEXT域指向node 从而实现插入
        current->next = node;
     
        tList->length++;
        return 0;
    }
    //获取某个位置的节点
    LinkListNode* LinkList_Get(LinkList* list, int pos)
    {
        int ret = 0;
        LinkListNode* current = NULL; //辅助节点指针变量
        LinkListNode* temp = NULL;
        tagList* tList;
        if (list == NULL || pos <0)
        {
            ret = -1;
            cout << "Get Err" << endl;
            return NULL;
        }
     
        tList = (tagList*)list;
     
        current = &(tList->header);   //Current首先指向头结点
        for(int i = 0; ((i < pos) && (current->next !=NULL)); i++)
        {
            current = current->next;
        }
        temp = current->next;
        //返回Current的Next域为POS位置信息
        return temp;
    }
     
     
    //删除某个位置的节点
    LinkListNode* LinkList_Delete(LinkList* list, int pos)
    {
        int ret = 0;
        LinkListNode* current = NULL;  
        LinkListNode* temp = NULL;   //定义中间指针变量
     
        tagList* tList;
        if (list == NULL || pos <0)
        {
            ret = -1;
            cout << "Get Err" << endl;
            return NULL;
        }
     
        tList = (tagList*)list;
     
        current = &(tList->header);
        for(int i = 0; ((i < pos) && (current->next !=NULL)); i++)
        {
            current = current->next;    //Current指向POS节点的前一个位置
        }
        //temp指针指向POS位置的节点
        temp = current->next;
        //将temp 也就是POS位置的NEXT域值赋给CurrentNext域 从而实现跳过删除
        current->next =temp->next;
     
        tList->length--;
        return temp;
    }
     
     

    测试函数:

    #include <iostream>
    #include "linkList.h"
    using namespace std;
     
    typedef struct _Teacher
    {
        LinkListNode node;   //必须在所需要的数据结构中添加LinkListNode类型的node!!
        int age;
        char name[64];
    }Teacher;
     
    int main()
    {
        int len = 0;
        int ret = 0;
        LinkList* list = NULL;
        Teacher t1, t2, t3, t4, t5;
        t1.age = 31; 
        t2.age = 32;
        t3.age = 33;
        t4.age = 34;
        t5.age = 35;
        //创建
        list = LinkList_Create();
        if(list == NULL)
        {
            return -1;
        }
        len = LinkList_Length(list);
        //逐条插入
        ret = LinkList_Insert(list, (LinkListNode*)(&t1), 0);
        ret = LinkList_Insert(list, (LinkListNode*)(&t2), 0);
        ret = LinkList_Insert(list, (LinkListNode*)(&t3), 0);
        ret = LinkList_Insert(list, (LinkListNode*)(&t4), 0);
        ret = LinkList_Insert(list, (LinkListNode*)(&t5), 0);
     
        for (int i = 0; i < LinkList_Length(list); i++)
        {
            cout << "List的遍历" << endl;
            cout << "age:" << ((Teacher*)LinkList_Get(list, i))->age << endl;
        }
        cout << endl;
        //头删
        while(LinkList_Length(list) > 0)
        {
            cout << "删除的元素:" << ((Teacher*)LinkList_Delete(list, 0))->age << endl;
        }
     
        system("pause");
        return 0;
    }
  • 相关阅读:
    xss学习笔记
    【转】Python中的正则表达式(re)
    数据隐藏技术揭秘笔记
    几道排列组合题的总结
    Notepad++来比较文件
    快捷键总结
    进制转换
    leetcode刷题(三)
    leetcode刷题(二)
    leetcode刷题(一)
  • 原文地址:https://www.cnblogs.com/Lxk0825/p/9519919.html
Copyright © 2011-2022 走看看