单链表的实现

来源:互联网 发布:医疗大数据公司排名 编辑:程序博客网 时间:2024/04/30 15:15

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 listSList* ListCreate();//insert data in posint ListInsert(SList* list,int pos,void* data);//delete data in pos//return delete datavoid* ListDelete(SList* list,int pos);//find data//return find data or NULLvoid* ListFind(SList* list,FindFunc func,void* data);//foreachvoid ListForEach(SList* list,ForEachFunc func);//destroy listvoid 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 NULLSList* ListCreate(){    SList* list = (SList*)malloc(sizeof(SList));    if (list == NULL) {        return NULL;    }    memset(list,0,sizeof(SList));        return list;}//insert data in posint 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 datavoid* 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 NULLvoid* 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;}//foreachvoid 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 listvoid 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;}



0 0