- LinkList.h
- main.c
- LinkList.c
- 输出:
写的有点怪
//LinkList.h
typedef void LinkList; //定义链表
typedef struct tag_LinkListNode LinkListNode; //定义链表指针域
typedef struct tag_LinkListNode //定义 指针域的嵌套
{
LinkListNode* next;
}LinkListNode;
// 上面用来void,还是做了封装的
******************************************************
//LinkList.c
//定义实际使用的?链表头结点,header是个LinkListNode结构体,内含嵌套指针
typedef struct tag_LinkList
{
LinkListNode header;
int length;
}TLinkList;
******************************************************
//main.c
//这里才定义了数值,可能直观点,在主函数才定义数据
但也让嵌套多了一层,每个数据Value里面嵌套LinkListNode指针域;
很多此一举的感觉,回头改成一体的:LinkListNode里直接包含数据(感觉简单一点)
struct Value
{
LinkListNode header;
int data;
};
LinkList.h
#ifndef LINKLIST_H
#define LINKLIST_H
//typedef void ElemType;
typedef void LinkList;
typedef struct tag_LinkListNode LinkListNode;
typedef struct tag_LinkListNode
{
ElemType data;
LinkListNode* next;
}LinkListNode;
//创建链表
LinkList* LinkList_Create();
//获取链表的最大长度
int LinkList_Capacity(LinkList* list);
//销毁链表
void LinkList_Destroy(LinkList* list);
//清空链表
void LinkList_Clear(LinkList* list);
//获取链表的长度
int LinkList_Length(LinkList* list);
//元素插入链表;在链表list的pos位置插入新元素node
//返回值为1表示插入成功,0表示插入失败
int LinkList_Insert(LinkList* list,LinkListNode* node,int pos);
//获取链表中某个位置的元素;获取链表list的pos位置处的元素
//返回值为pos位置处的元素,NULL表示获取失败
LinkListNode* LinkList_Get(LinkList* list,int pos);
//将某个元素从链表中删除;删除链表list的pos位置处的元素
//返回值为删除的元素,NULL表示获取失败
LinkListNode* LinkList_Delete(LinkList* list,int pos);
#endif
main.c
这里用的是头插法建立链表
#include#include #include "LinkList.h" struct Value { LinkListNode header; int data; }; int main(int argc, char *argv[]) { int i; LinkList* list = LinkList_Create(); //创建元素 struct Value v1 ; struct Value v2 ; struct Value v3 ; struct Value v4 ; struct Value v5 ; //赋值 v1.data = 1; v2.data = 2; v3.data = 3; v4.data = 4; v5.data = 5; //插入元素 LinkList_Insert(list,(LinkListNode*)&v1,0); LinkList_Insert(list,(LinkListNode*)&v2,0); LinkList_Insert(list,(LinkListNode*)&v3,0); LinkList_Insert(list,(LinkListNode*)&v4,0); LinkList_Insert(list,(LinkListNode*)&v5,0); // for(i=0;i struct Value* pl = (struct Value*)LinkList_Get(list,i); printf("%dn",pl->data); } while(LinkList_Length(list) > 0) { struct Value* pl = (struct Value*)LinkList_Delete(list,LinkList_Length(list)-1); printf("%dn",pl->data); } LinkList_Destroy(list); return 0; }
LinkList.c
#include#include #include "LinkList.h" typedef struct tag_LinkList { LinkListNode header; int length; }TLinkList; //创建链表 LinkList* LinkList_Create() // O(1) { TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList)); if( ret != NULL ) { ret->length = 0; ret->header.next = NULL; } 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_Length(LinkList* list) { TLinkList* sList = (TLinkList*)list; //强制类型转换 int ret = -1; if(sList != NULL) { ret = sList->length; } return ret; } //元素插入链表;在链表slist的pos位置插入新元素node //返回值为1表示插入成功,0表示插入失败 int LinkList_Insert(LinkList* list,LinkListNode* node,int pos) { TLinkList* sList = (TLinkList*)list; //强制类型转换 //1.判断链表是否正确 //2.判断插入位置是否正确 int ret = (sList != NULL) && (0 <= pos) && (node!=NULL); int i = 0; if(ret) { LinkListNode* current = (LinkListNode*)sList; //指向表头结点 for(i=0;(i next != NULL);i++) { current = current->next; } node->next = current->next; current->next = node; sList->length++; } return ret; } //获取链表中某个位置的元素;获取链表list的pos位置处的元素 //返回值为pos位置处的元素,NULL表示获取失败 LinkListNode* LinkList_Get(LinkList* list,int pos) { TLinkList* sList = (TLinkList*)list; //强制类型转换 LinkListNode* ret = NULL; int i = 0; //1.判断链表是否正确 //2.判断插入位置是否正确 if((sList != NULL) && (0 <= pos) && (pos < sList->length)) { //定义current指向表头 LinkListNode* current = (LinkListNode*)sList; for(i=0;i current = current->next; } ret = current->next; } return ret; } //将某个元素从链表中删除;删除链表sList的pos位置处的元素 //返回值为删除的元素,NULL表示获取失败 LinkListNode* LinkList_Delete(LinkList* list,int pos) { TLinkList* sList = (TLinkList*)list; //强制类型转换 LinkListNode* ret = NULL; int i = 0; //1.判断链表是否正确 //2.判断插入位置是否正确 if((sList != NULL) && (0 <= pos) && (pos < sList->length)) { //定义current指向表头 LinkListNode* current = (LinkListNode*)sList; for(i=0;i current = current->next; } ret = current->next; current->next = ret->next; sList->length--; } return ret; }
输出:



