学习数据结构已经很久了,一直没有用上,最近时间有点空闲,所以翻出来炒一炒。子曰:温故而知新。当初学习数据结构的时候,买的是国嵌唐老师的视频,所以这些代码和唐老师课上写的几乎一模一样,若转载请注明出自国嵌唐老师数据结构教程。
首先来看第二个例子,链式链表:
头文件
#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技巧的例子。