码迷,mamicode.com
首页 > 其他好文 > 详细

链式链表的C风格实现

时间:2018-08-22 20:39:42      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:null   分配   header   清空   ret   添加   ==   get   link   

头文件:

#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;
}

 

链式链表的C风格实现

标签:null   分配   header   清空   ret   添加   ==   get   link   

原文地址:https://www.cnblogs.com/Lxk0825/p/9519919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!