可复用单链表的实现

本文介绍了如何使用C语言实现一个可复用的单链表,包括创建、销毁、插入、删除、获取元素、计算长度以及反转链表等基本操作。示例代码展示了链表的操作,并通过主函数进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/******************LinkList.h**********************/ 
#ifndef LINKLIST_H_
#define LINKLIST_H_
typedef void LinkList;
//定义结点指针域 
typedef struct _tag_LinkListNode  LinkListNode ;
struct _tag_LinkListNode
{
    LinkListNode* next;    //指针域内含有指向自身的指针,故需先声明 
};
//定义头结点
typedef struct  _tag_LinkList
{
    LinkListNode header;
    int length;
}TLinkList;

//创建空链表 
LinkList* LinkList_Create();
//销毁链表 
void LinkList_Destroy(LinkList* list);
//清空链表 
void LinkList_Clear(LinkList* list);
//向链表的第pos个元素处插入node元素 注:POS=为第一个元素 
int LinkList_Insert(LinkList* list, LinkListNode* node,int pos);
//删除链表第pos个元素 
LinkListNode* LinkListDelete(LinkList* list, int pos);
//获取链表第pos个元素 
LinkListNode* LinkList_Get(LinkList* list, int pos);
//获取链表的元素 
int LinkList_Length(LinkList* list);
//反转单链表 
int LinkList_Reverse(LinkList* list);
#endif
/******************LinkList.c**********************/ 
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"

LinkList* LinkList_Create()
{
    TLinkList *ret = (TLinkList*)malloc(sizeof(TLinkList));
    if(ret != NULL)
    {
        ret->header.next = NULL;
        ret->length = 0;
    }
    return ret;
}
void LinkList_Destroy(LinkList* list)
{
    free(list);
}
void LinkList_Clear(LinkList* list)
{
    TLinkList *slist = (TLinkList*)list;
    if(slist!=NULL)
    {
        slist->length=0;
        slist->header.next = NULL;
    }
}

int LinkList_Insert(LinkList* list, LinkListNode* node,int pos)
{
    TLinkList* slist = (TLinkList *)list;
    int ret = (slist!=NULL)&&(pos>=0)&&(node!=NULL);
    int i=0;
    
    if(ret)
    {
        LinkListNode* current = (LinkListNode*)slist;
        
        for(i=0;(i<pos)&&(current->next!=NULL);i++)
        {
            current = current->next;
        }
        
        node->next = current->next;
        current->next = node;
        slist->length++;
    } 
    return ret;
}

LinkListNode* LinkListDelete(LinkList* list, int pos)    //pos=0为第一个元素 
{
    TLinkList* slist = (TLinkList*)list;
    LinkListNode* ret = NULL;
    int i=0;
    if((slist!=NULL) && (pos>=0) &&(pos<slist->length))
    {
        LinkListNode* current = (LinkListNode*)slist;
        for(i=0;i<pos;i++)
        {
            current=current->next;
        }
        ret = current->next;
        current->next = ret->next;
        slist->length--;
    }          
    return ret;
}

LinkListNode* LinkList_Get(LinkList* list, int pos)
{
    TLinkList* slist = (TLinkList*)list;
    LinkListNode* ret = NULL;
    int i=0;
    if((slist!=NULL) && (pos>=0) &&(pos<slist->length))
    {
        LinkListNode* current = (LinkListNode*)slist;
        for(i=0;i<pos;i++)
        {
            current=current->next;
        }
        ret = current->next;
    }          
    return ret;
}

int LinkList_Length(LinkList* list)
{
    TLinkList* slist = (TLinkList*)list;
    int ret=-1;
    if(slist!=NULL)
    {
        ret = slist->length;
    }
    return ret;
}
int LinkList_Reverse(LinkList* list)
{
    TLinkList* slist = (TLinkList*)list;
    LinkListNode* prev = NULL;
    LinkListNode* tmp = NULL;
    int ret = (slist!=NULL);
    if(ret)
    {
        LinkListNode* head = slist->header.next;  //第一个元素指针域 
        while(head!=NULL)
        {
            tmp = head;
            head = head->next;
            tmp->next = prev;
            prev = tmp; 
        }
        slist->header.next =  tmp; 
    }
    return ret;
}

/*
  Name:    链表的实现 
  Author:  LXB 
  Date: 16/05/14 16:40
  Description:     包括链表创立、删除、添加、销毁、反转等基本操作  
*/
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
//定义数据元素(指针域及数据域) 
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;
  struct Value v6;
  
  v1.v=1;
  v2.v=2;
  v3.v=3;
  v4.v=4;
  v5.v=5;
  v6.v=6;
  
  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));
  LinkList_Insert(list,(LinkListNode*)&v6,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*)LinkListDelete(list,LinkList_Length(list)-1);
      printf("%d\n",pv->v);
  }
  LinkList_Reverse(list);                       
  for(i=0;i<LinkList_Length(list);i++)
  {
      struct Value* pv = (struct Value*)LinkList_Get(list,i);
      printf("%d\n",pv->v);
  }
  LinkList_Destroy(list);
  system("PAUSE");	
  return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值