单链表的实现(C语言版)

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 单链表的实现(C语言版)

FLinkList.h头文件:

#ifndef _FLINKLIST_H_
#define _FLINKLIST_H_
typedef void LinkList;  //利用void指针来接受任意类型的数据
typedef struct _tag_LinkListNode FLinkListNode;
struct _tag_LinkListNode
{
  FLinkListNode* next;
}
LinkList* LinkList_Create();
void LinkList_Destroy(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


FLinkList.c实现:

#include <stdio.h>
#include <malloc.h>
#include "FLinkList.h"
typedef struct _tag_LinkList
{
  FLinkListNode header;
  int length;
}FLinkList;
FLinkList* LinkList_Create()
{
  FLinkList* ret=(FLinkList*)malloc(sizeof(FLinkList));
  if(ret!=NULL)
  {
    ret->length=0;
    ret->header.next=NULL;
  } 
}
void LinkList_Destroy(LinkList* list)
{
  free(list); 
}
void LinkList_Clear(LinkList* list)
{
  FLinkList* ret=(FLinkList*)list;
  if(ret!=NULL)
  {
  ret->length=0;
  ret->header.next=NULL;
  }
}
int LinkList_Length(LinkList* list)
{
  FLinkList* flist=(FLinkList*)list;
  int ret=-1;
  if(ret!=NULL)
  {
    return flist->length;
  }
  return ret;
}
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
  FLinkList* flist=(FLinkList*)list;
  int ret=((flist!=NULL)&&(pos>=0)&& (node!=NULL));
  int i=0;
  if(ret)
  {
    FLinkListNode* current=(FLinkListNode*)flist;
    for(;(i<pos)&&(current->next!=NULL);i++)
    {
      current=current->next;
    }
    node->next=current->next;
    current->next=node;
    flist->length++;
  }
  return ret;
}
LinkListNode* LinkList_Get(LinkList* list, int pos)
{
  FLinkList* flist=(FLinkList*)list;
  FLinkListNode* ret=NULL;
  int i=0;
  if((flist!=NULL)&&(pos>=0)&& (pos<=flist->length))
  { 
    FLinkListNode* current=(FLinkListNode*) flist;
    for(;(i<pos);i++)
    {
      current=current->next;
    }
    ret=current->next;
  }
  return ret;
}
LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
  FLinkList* flist=(FLinkList*)list;
  FLinkListNode* ret=NULL;
  int i=0;
  if((flist!=NULL)&&(pos>=0)&& (pos<=flist->length))
  { 
    FLinkListNode* current=(FLinkListNode*) flist;
    for(;(i<pos);i++)
    {
      current=current->next;
    }
    ret=current->next;
    current->next=ret->next;
    flist->length--;
  }
  return ret;
}


链表功能检测:

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct Value
{
    LinkListNode header;
    int v;
};
int main(int argc, char *argv[]) 
{
    int i = 0;
    LinkList* list = LinkList_Create();
    struct Value v1;
    struct Value v2;
    struct Value v3;
    struct Value v4;
    struct Value v5;
    v1.v = 1;
    v2.v = 2;
    v3.v = 3;
    v4.v = 4;
    v5.v = 5;
    LinkList_Insert(list, (LinkListNode*)&v1, LinkList_Length(list));
    LinkList_Insert(list, (LinkListNode*)&v2, LinkList_Length(list));
    LinkList_Insert(list, (LinkListNode*)&v3, LinkList_Length(list));
    LinkList_Insert(list, (LinkListNode*)&v4, LinkList_Length(list));
    LinkList_Insert(list, (LinkListNode*)&v5, LinkList_Length(list));
    for(i=0; i<LinkList_Length(list); i++)
    {
        struct Value* pv = (struct Value*)LinkList_Get(list, i);
        printf("%d\n", pv->v);
    }
    while( LinkList_Length(list) > 0 )
    {
        struct Value* pv = (struct Value*)LinkList_Delete(list, 0);
        printf("%d\n", pv->v);
    }
    LinkList_Destroy(list);
    return 0;
}


代码首部的   struct  Value  结构体,定义了所需要在链表中插入的数据类型,在  GET  操作中的强转是技术的关键,使得实现任意数据类型的插入!!

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
8天前
|
C语言
对链表使用插入排序的C语言实现示例
对链表使用插入排序的C语言实现示例
|
8天前
|
存储 编译器 C语言
【数据结构】C语言实现单链表万字详解(附完整运行代码)
【数据结构】C语言实现单链表万字详解(附完整运行代码)
50 0
|
8天前
|
C语言
基于链表实现的链式管理系统(C语言课设)
基于链表实现的链式管理系统(C语言课设)
|
8天前
|
C语言
链接未来:深入理解链表数据结构(二.c语言实现带头双向循环链表)
链接未来:深入理解链表数据结构(二.c语言实现带头双向循环链表)
33 0
|
8天前
|
测试技术
LeetCode | 141.环形链表(C语言版)
LeetCode | 141.环形链表(C语言版)
31 1
|
8天前
|
测试技术
LeetCode | 24.两两交换链表中的节点(C语言版)
LeetCode | 24.两两交换链表中的节点(C语言版)
39 0
|
8天前
|
C语言
C语言用头插法建立单链表
C语言用头插法建立单链表
5 0
|
8天前
|
算法 C语言
【算法与数据结构】 C语言实现单链表队列详解2
【算法与数据结构】 C语言实现单链表队列详解
|
8天前
|
存储 算法 C语言
【算法与数据结构】 C语言实现单链表队列详解1
【算法与数据结构】 C语言实现单链表队列详解
|
8天前
|
存储 C语言
C语言之单链表的实现以及链表的介绍
C语言之单链表的实现以及链表的介绍