1.头文件
#ifndef LinkList_h
#define LinkList_h
#include <stdio.h>
typedef struct Node{
struct Node *next;
}Node;
typedef struct LinkNode{
Node node;
void * data;
}LinkNode;
typedef struct LinkList{
//链表长度
int length;
//链表的头结点
LinkNode listNode;
}LinkList;
//初始化链表
void initList(LinkList *list);
//判断链表是否为空
int emptyList(LinkList *list);
//清空链表
void clearList(LinkList *list);
//获取指定位置的数
void getDataByIndex(LinkList *list, int index, void **da);
//在指定位置插入数据
void insertDataByIndex(LinkList *list,int index, void *da);
//删除指定位置的数据,并把数据存到da中
void deleteDataByIndex(LinkList *list, int index,void **da);
//获取链表的长度
int getLength(LinkList *list);
#endif /* LinkList_h */
2.实现
#include "LinkList.h"
#include <stdlib.h>
//初始化链表
void initList(LinkList *list){
list->length = 0;
list->listNode.node.next = NULL;
}
//判断链表是否为空
int emptyList(LinkList *list){
if (list->length > 0) {
return 1;
}
return 0;
}
//清空链表
void clearList(LinkList *list){
while (emptyList(list)) {
int *da;
deleteDataByIndex(list, 0, &da);
printf("%d\n", *da);
}
}
//获取指定位置的数
void getDataByIndex(LinkList *list, int index, void **da){
if (index < 0 || index >= list->length ) {
return;
}
LinkNode *pNode = &list->listNode;
for (int i = 0; i <= index; i++) {
pNode = (LinkNode *)pNode->node.next;
}
*da = pNode->data;
}
//在指定位置插入数据
void insertDataByIndex(LinkList *list,int index, void *da){
if (index < 0 || index > list->length) {
return;
}
//开辟结点空间
LinkNode *linkNode = calloc(1, sizeof(*linkNode));
linkNode->data = da;
linkNode->node.next = NULL;
//记录插入点的前一个结点
LinkNode *pNode = &list->listNode;
for (int i = 0; i < index; i++) {
pNode = (LinkNode *)pNode->node.next;
}
linkNode->node.next = pNode->node.next;
pNode->node.next = &linkNode->node;
list->length++;
}
//删除指定位置的数据,并把数据存到da中
void deleteDataByIndex(LinkList *list, int index,void **da){
if (index < 0 || index >= list->length ) {
return;
}
//记录插入点的前一个结点
LinkNode *pNode = &list->listNode;
for (int i = 0; i < index; i++) {
pNode = (LinkNode *)pNode->node.next;
}
LinkNode *cNode = (LinkNode *)pNode->node.next;
pNode->node.next = cNode->node.next;
*da = cNode->data;
free(cNode);
list->length--;
}
//获取链表的长度
int getLength(LinkList *list){
return list->length;
}
网友评论