数据结构之链式链表

学习数据结构已经很久了,一直没有用上,最近时间有点空闲,所以翻出来炒一炒。子曰:温故而知新。当初学习数据结构的时候,买的是国嵌唐老师的视频,所以这些代码和唐老师课上写的几乎一模一样,若转载请注明出自国嵌唐老师数据结构教程。

首先来看第二个例子,链式链表:

头文件

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

typedef void LinkList;
typedef struct tag_LinkListNode LinkListNode;
struct tag_LinkListNode
{
    LinkListNode* next;
};

LinkList* LinkList_Create();

void LinkList_Destroy(LinkList* list);

int 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

我个人有点小小的强迫症,代码尽量要求简洁,所以没有注释,有什么不明白的可以留言。

实现文件

#include "LinkList.h"
#include <malloc.h>

typedef struct tag_LinkList
{
    //这里说个小技巧,length和header不能调换,否则在强制类型转换的时候会有问题
    LinkListNode header;
    int length;
}TLinkList;

LinkList* LinkList_Create()
{
    TLinkList* ret = NULL;
    
    ret = (TLinkList*)malloc(sizeof(TLinkList));
    
    if (ret)
    {
  		ret->header.next = NULL;
  		ret->length = 0;
	}
    
    return (LinkList*)ret;
}

void LinkList_Destroy(LinkList* list)
{
 	 free(list);
}

int LinkList_Clear(LinkList* list)
{
 	TLinkList* sList = (TLinkList*)list;
 	int ret = -1;
 	
 	if (sList != NULL)
 	{
  	   sList->length = 0;
  	   sList->header.next = NULL;
  	}
 	
 	return ret;
}

int LinkList_Length(LinkList* list)
{
 	TLinkList* sList = (TLinkList*)list;
 	int ret = -1;
 	
 	if (sList != NULL)
 	{
  	   ret = sList->length;
  	}
 	
 	return ret;
}

int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
 	TLinkList* sList = (TLinkList*)list;
 	int ret = (sList != NULL) && (node != NULL);
 	ret = ret && (pos >= 0);
 	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* 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;
}

LinkListNode* LinkList_Delete(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; 
	   current->next = ret->next;
	   
	   sList->length--; 
    }
 	
 	return ret;
}
 
测试文件 

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"

typedef struct tag_Value
{
    LinkListNode header;
    int v;
}Value;
int main(int argc, char *argv[])
{
 	LinkList* list = LinkList_Create();
 	Value a,b,c,d,e,f;
 	a.v = 1;
 	b.v = 2;
 	c.v = 3;
 	d.v = 4;
 	e.v = 5;
 	f.v = 6;

 	int i = 0;
 	
 	LinkList_Insert(list, (LinkListNode*)&a, 0);
 	LinkList_Insert(list, (LinkListNode*)&b, 0);
 	LinkList_Insert(list, (LinkListNode*)&c, 0);
 	
 	printf("length = %d\n", LinkList_Length(list));
 	
 	for (i = 0; i < LinkList_Length(list); i++)
 	{
	 	Value* pV = (Value*)LinkList_Get(list, i);
	 	printf("%d\n", pV->v);
  	}
  	
  	LinkList_Clear(list);
  	for (i = 0; i < LinkList_Length(list); i++)
 	{
	 	Value* pV = (Value*)LinkList_Get(list, i);
	 	printf("%d\n", pV->v);
  	}
  	
  	printf("length = %d\n", LinkList_Length(list));
  	
  	LinkList_Insert(list, (LinkListNode*)&a, LinkList_Length(list));
 	LinkList_Insert(list, (LinkListNode*)&b, LinkList_Length(list));
 	LinkList_Insert(list, (LinkListNode*)&c, LinkList_Length(list));
 	LinkList_Insert(list, (LinkListNode*)&d, LinkList_Length(list));
 	LinkList_Insert(list, (LinkListNode*)&e, LinkList_Length(list));
 	LinkList_Insert(list, (LinkListNode*)&f, LinkList_Length(list));
  	
  	for (i = 0; i < LinkList_Length(list); i++)
 	{
	 	Value* pV = (Value*)LinkList_Get(list, i);
	 	printf("%d\n", pV->v);
  	}
  	
  	printf("length = %d\n", LinkList_Length(list));
  	
  	while (LinkList_Length(list) > 0)
  	{
	    Value* pV = (Value*)LinkList_Delete(list, LinkList_Length(list) - 1);
	 	printf("%d\n", pV->v);
    }
    printf("length = %d\n", LinkList_Length(list));
    
    LinkList_Destroy(list);    

    system("PAUSE");	
    return 0;
}
好了,链式链表展示完毕,所有代码都可以添加到工程直接利用,后期我会再放上如何show技巧的例子。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值