用数组实现链表一(静态链表)

来源:互联网 发布:推荐翻墙工具 .知乎 编辑:程序博客网 时间:2024/05/19 08:23

代码参考自严版《数据结构》


/* * ===================================================================================== * *       Filename:  arraylink.c * *    Description:  数组实现链表 * *        Version:  1.0 *        Created:  2012年11月27日 10时05分03秒 *       Revision:  none *       Compiler:  gcc * *         Author:  Xingwang Su (http://blog.csdn.net/njzhiyuan) *   Organization:   * * ===================================================================================== */#include <stdio.h>#include <stdlib.h>typedef struct Node {int val;size_t next;} Node;typedef struct arraylink {size_t capacity;  //列表容量,同时也用于识别链表尾(size_t类型的特别性,总是大于等于0)size_t available; //空闲列表中第一个下标size_t length;    //列表长度size_t head;       //记录列表头Node *array;  //存储数据的数组指针} arraylink;//初始化链表int init_arraylink(arraylink *arl, size_t cap) {size_t index = 0;if (NULL == arl || 0 == cap) {return -1;}if ((arl->array = (Node *)malloc(cap)) == NULL) {return -1;}arl->head = arl->capacity = cap;arl->available = 0;arl->length = 0;//初始化好数组,并设置好各个节点的后继元素, 最后一个节点的后继为capacityfor (index = 1; index <= cap; ++index) {arl->array[index-1].next = index;}return 0;}//判断列表空inline int is_arraylink_empty(const arraylink *arl) {return NULL == arl || arl->length == 0;}//判断列表满inline int is_arraylink_full(const arraylink *arl) {return NULL != arl && arl->length != arl->capacity;}//获取链表长度inline size_t get_arraylink_length(const arraylink *arl) {return NULL == arl ? 0 : arl->length;}//销毁列表int destroy_arraylink(arraylink *arl) {if (NULL == arl) {return -1;}arl->length = arl->head = arl->capacity = arl->available = 0;if (NULL != arl->array) {free(arl->array);arl->array = NULL;}return 0;}//重置列表int reset_arraylink(arraylink *arl) {size_t index = 0;if (NULL == arl) {return -1;}arl->available = 0;arl->length = 0;//重置各个节点的后继元素,最后一个节点的后继为capacityfor(index = 0; index <= arl->capacity; ++index){arl->array[index-1].next = index;}arl->head = arl->capacity;return 0;}//返回链表中第pos个元素, pos从0开始int get_arraylink_elem(const arraylink *arl, size_t pos, int *val) {size_t index = 0;size_t local = 0;if (NULL == arl || NULL == val || pos >= get_arraylink_length(arl)) {return -1;}local = arl->head;for (index = 0; index < pos; ++index) {local = arl->array[local].next;}*val = arl->array[local].val;return 0;}//在查找链表中的元素int locate_arraylink_elem(const arraylink *arl, int val, size_t *pos) {size_t index = 0;size_t local = 0;if (NULL == arl || is_arraylink_empty(arl)) {return -1;}for (local = arl->head; local != arl->capacity && arl->array[local].val != val; local = arl->array[local].next) {++index;}//查找失败if (local == arl->capacity) {return -1;}if (NULL != pos) {*pos = index;}return 0;}//返回元素的前驱int prior_arraylink_elem(const arraylink *arl, int val, size_t *pos) {size_t prelocal = 0;size_t local = 0;if (NULL != arl || is_arraylink_empty(arl) || NULL == pos) {return -1;}prelocal = arl->head;//头节点的前驱无效if ( arl->array[prelocal].val == val) {*pos = arl->capacity;return -1;}for (local = arl->array[prelocal].next; local != arl->capacity && arl->array[local].val != val; local = arl->array[local].next) {prelocal = local;}//查找失败if (local == arl->capacity) {return -1;}*pos = prelocal;return 0;}//返回元素的后继int next_arraylink_elem(const arraylink *arl, int val, size_t *pos) {size_t local = 0;if (NULL != arl || is_arraylink_empty(arl) || NULL == pos) {return -1;}for(local = arl->head; local != arl->capacity && arl->array[local].val != val;local = arl->array[local].next){ }//查找失败if (local == arl->capacity) {return -1;}*pos = arl->array[local].next;//尾节点的后继无效if (*pos == arl->capacity) {return -1;}return 0;}//添加数据到位置pos前int insert_arraylink(arraylink *arl, size_t pos, int val) {size_t index = 0;size_t curra = 0; //空闲列表中第一个下标size_t precorpos = 0;size_t corpos = 0;if (NULL == arl || pos > get_arraylink_length(arl) || is_arraylink_full(arl)){return -1;}curra = arl->available;arl->available = arl->array[curra].next;arl->array[curra].val = val;precorpos = arl->head;if (0 == pos) {arl->head = curra;arl->array[curra].next = precorpos;arl->length += 1;return 0;}corpos = precorpos;for (index = 0; index < pos; ++index) {precorpos = corpos;corpos = arl->array[precorpos].next;}arl->array[curra].next = corpos;arl->array[precorpos].next = curra;arl->length += 1;return 0;}//添加数据到表头inline int add_to_arraylink_head(arraylink *arl, int val) {return insert_arraylink(arl, 0, val);}//添加数据到表尾inline int add_to_arraylink_tail(arraylink *arl, int val) {return insert_arraylink(arl, get_arraylink_length(arl), val);}//删除链表pos位置的元素int delete_arraylink(arraylink *arl, size_t pos, int *val) {size_t index = 0;size_t precorpos = 0;size_t corpos = 0;if (NULL == arl || pos >= get_arraylink_length(arl) || is_arraylink_empty(arl)) {return -1;}precorpos = arl->head;corpos = precorpos;for (index = 0; index < pos; ++index) {precorpos = corpos;corpos = arl->array[precorpos].next;}arl->array[precorpos].next = arl->array[corpos].next;arl->length -= 1;//删除链表头元素if (0 == pos) {arl->head = arl->array[precorpos].next;}if (NULL != val) {*val = arl->array[corpos].val;}//将节点存入空闲列表arl->array[corpos].next = arl->available;arl->available = corpos;return 0;}//从链表头删除元素int delete_arraylink_from_head(arraylink *arl, int *val) {return delete_arraylink(arl, 0, val);}//从链表尾删除元素int delete_arraylink_from_tail(arraylink *arl, int *val) {return delete_arraylink(arl, get_arraylink_length(arl) - 1, val);}int main(int argc, char *argv[]) {return 0;}


原创粉丝点击