数据结构之顺序链表

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

首先来看第一个例子,顺序表:

头文件

#ifndef _SEQLIST_H_
#define _SEQLIST_H_

typedef void SeqList;
typedef void SeqListNode;

SeqList* SeqList_Create(int capacity);

void SeqList_Destroy(SeqList* list);

int SeqList_Clean(SeqList* list);

int SeqList_Length(SeqList* list);

int SeqList_Capacity(SeqList* list);

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);

SeqListNode* SeqList_Delete(SeqList* list, int pos);

SeqListNode* SeqList_Get(SeqList* list, int pos);

#endif

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

实现文件

#include "SeqList.h"
#include <stdio.h>
#include <malloc.h>

typedef unsigned int TSeqListNode;
typedef struct tag_SeqList
{
    int	length;
    int capacity;
    TSeqListNode* node;
}TSeqList;

SeqList* SeqList_Create(int capacity)
{
    TSeqList* ret = NULL;
    if (capacity >= 0)
    {
	   ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);	
	   
	   if (ret)
	   {
	       ret->capacity = capacity;
		   ret->length = 0;
		   ret->node = (TSeqListNode*)(ret + 1);
		   
		   return (SeqList*)(ret);	   
	   } 
    }
    
    return ret;
}

void SeqList_Destroy(SeqList* list)
{
 	 free(list);
}

int SeqList_Clean(SeqList* list)
{
 	TSeqList* sList = (TSeqList*)list;
 	int ret = -1;
 	
 	if (sList != NULL)
 	{
	   sList->length = 0;
  	}
 	
 	return ret;
}
 	
int SeqList_Length(SeqList* list)
{
 	TSeqList* sList = (TSeqList*)list;
 	int ret = -1;
 	
 	if (sList != NULL)
 	{
  	   ret = sList->length;
  	}
 	
 	return ret;
}

int SeqList_Capacity(SeqList* list)
{
 	TSeqList* sList = (TSeqList*)list;
 	int ret = -1;
 	
 	if (sList != NULL)
 	{
  	   ret = sList->capacity;
  	}
 	
 	return ret;
}

int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
 	TSeqList* sList = (TSeqList*)list;
 	int i = 0;
 	int ret = (sList != NULL) && (node != NULL);
	ret = (sList->length + 1 <= sList->capacity) && (pos >= 0);
	
 	if (ret)
 	{
	   if (pos > sList->length)
	   {
	       pos = sList->length;
	   }
	   
	   for (i = sList->length; i > pos; i--)
	   {
	   	   sList->node[i] = sList->node[i - 1];
	   }
	   
	   sList->node[pos] = (TSeqListNode)node;
	   sList->length++;
	}
 	
 	return ret;
}

SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
    TSeqList* sList = (TSeqList*)list;
 	int i = 0;
 	SeqListNode* ret = NULL;
 	
 	if ((sList != NULL) && (pos >= 0) && (pos < sList->length))
 	{
	   ret = (SeqListNode*)(sList->node[pos]);
	   
	   for (i = pos + 1; i < sList->length; i++)
	   {
	   	   sList->node[i - 1] = sList->node[i];
	   }
	   
	   sList->length--;
	}
	
 	return ret;
}

SeqListNode* SeqList_Get(SeqList* list, int pos)
{
 	TSeqList* sList = (TSeqList*)list;
	SeqListNode* ret = NULL;
 	
 	if ((sList != NULL) && (pos >= 0) && (pos < sList->length))
 	{
		ret = (SeqListNode*)sList->node[pos];
	}
 	
 	return ret;
}

测试文件

<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"

int main(int argc, char *argv[])
{
    SeqList* list = SeqList_Create(10);
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 4;
    int e = 5;
    int f = 6;
    int i = 0;
    
    SeqList_Insert(list, &a, 0);
    SeqList_Insert(list, &b, 0);
    SeqList_Insert(list, &c, 0);
    SeqList_Insert(list, &d, 0);
    SeqList_Insert(list, &e, 0);
    SeqList_Insert(list, &f, 0);
    
    printf("length = %d\n", SeqList_Length(list));
    
    for (i = 0; i < SeqList_Length(list); i++)
    {
	 	int* p = SeqList_Get(list, i);
	 	printf("%d\n", *p); 	
    }
    
    SeqList_Clean(list);
    
    for (i = 0; i < SeqList_Length(list); i++)
    {
	 	int* p = SeqList_Get(list, i);
	 	printf("%d\n", *p); 	
    }
    
    printf("capacity = %d\n", SeqList_Capacity(list));
  
  	SeqList_Insert(list, &a, SeqList_Length(list));
    SeqList_Insert(list, &b, SeqList_Length(list));
    SeqList_Insert(list, &c, SeqList_Length(list));
    SeqList_Insert(list, &d, SeqList_Length(list));
    SeqList_Insert(list, &e, SeqList_Length(list));
    SeqList_Insert(list, &f, SeqList_Length(list));
    
    for (i = 0; i < SeqList_Length(list); i++)
    {
	 	int* p = SeqList_Get(list, i);
	 	printf("%d\n", *p); 	
    }
    
    printf("capacity = %d\n", SeqList_Length(list));
    
    while(SeqList_Length(list) > 0)
    {
	    int* p = SeqList_Delete(list, SeqList_Length(list) - 1);
	    printf("%d\n", *p);
    }
    
    SeqList_Destroy(list);

    system("PAUSE"); 
    return 0;
}
 
 

上面代码都可以放到工程里面直接用,对于嵌入式开发的不能用到很多集成库,很多东西都要自己写,所以上面的代码是可复用的。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值