1.实现创建、插入、删除、查找、遍历和销毁这几个操作。代码如下:
//
// LinkList.h
// LinkList
//
// Created by Mac on 15/11/22.
// Copyright © 2015年 Mac. All rights reserved.
//
#ifndef LinkList_h
#define LinkList_h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct _tagSList{
void* data; //data storage
struct _tagSList* next;
}SList,*PSList;
typedef void(*ForEachFunc)(void*);
typedef bool(*FindFunc)(void*,void*);
//create a sigle list
SList* ListCreate();
//insert data in pos
int ListInsert(SList* list,int pos,void* data);
//delete data in pos
//return delete data
void* ListDelete(SList* list,int pos);
//find data
//return find data or NULL
void* ListFind(SList* list,FindFunc func,void* data);
//foreach
void ListForEach(SList* list,ForEachFunc func);
//destroy list
void ListDestroy(SList* list);
#endif /* LinkList_h */
//
// LinkList.c
// LinkList
//
// Created by Mac on 15/11/22.
// Copyright © 2015年 Mac. All rights reserved.
//
#include "LinkList.h"
//create a sigle list
//return list pointer when success,otherwise return NULL
SList* ListCreate(){
SList* list = (SList*)malloc(sizeof(SList));
if (list == NULL) {
return NULL;
}
memset(list,0,sizeof(SList));
return list;
}
//insert data in pos
int ListInsert(SList* list,int pos,void* data){
if (list == NULL || data == NULL || pos < 1) {
return -1;
}
int i = 0;
SList* p = list;
SList* tmp = NULL;
for (i = 0; i < pos-1; i++) {
p = p->next;
if(p == NULL)
return -1;
}
SList* node = (SList*)malloc(sizeof(SList));
if (node == NULL) {
return -1;
}
node->data = data;
tmp = p->next;
p->next = node;
node->next = tmp;
return 0;
}
//delete data in pos
//return delete data
void* ListDelete(SList* list,int pos){
if (list == NULL || pos < 1) {
return NULL;
}
int i = 0;
SList* p = list;
SList * tmp = NULL;
for (i = 0; i < pos-1; i++) {
p = p->next;
if(p == NULL)
return NULL;
}
tmp = p->next;
void* data = tmp->data;
p->next = tmp->next;
free(tmp);
tmp = NULL;
return data;
}
//find data
//return find data or NULL
void* ListFind(SList* list,FindFunc func,void* data){
if(list == NULL){
return NULL;
}
SList* p = list->next;
while (p) {
if(func != NULL){
if(func(p->data,data)){
return p->data;
}
}
p = p->next;
}
return NULL;
}
//foreach
void ListForEach(SList* list,ForEachFunc func){
if(list == NULL){
return;
}
SList* p = list->next;
while (p) {
if(func != NULL)
func(p->data);
p = p->next;
}
}
//destroy list
void ListDestroy(SList* list){
if (list == NULL) {
return;
}
SList* p = list->next;
SList * tmp = NULL;
while (p) {
tmp = p;
free(p->data);
p->data = NULL;
free(p);
p = NULL;
p = tmp->next;
}
free(list);
list = NULL;
}