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;
    }
  • 相关阅读:
    手把手教你利用create-nuxt-app脚手架创建NuxtJS应用
    初识NuxtJS
    webpack打包Vue应用程序流程
    用选择器代替表格列的筛选功能
    Element-UI
    Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[贪婪算法选特征]
    Sparse Principal Component Analysis via Rotation and Truncation
    Generalized Power Method for Sparse Principal Component Analysis
    Sparse Principal Component Analysis via Regularized Low Rank Matrix Approximation(Adjusted Variance)
    Truncated Power Method for Sparse Eigenvalue Problems
  • 原文地址:https://www.cnblogs.com/Lxk0825/p/9519919.html
Copyright © 2011-2022 走看看