终于开工了…… 此程序是对链表的简单实现,再不深究效率的情况下可简单当做队列,栈使用,只实现了部分功能,对于队列的经典程序可以查看周伟明老师的《多任务下数据结构与算法》。 //头文件 /* 功能: 带哨兵的双向链表 */ #ifndef _LIST_H #define _LIST_H #define DATA_TYPE int #define BOOL int #define TRUE 1 #define FALSE 0 //定义链表节点的数据结构 typedef struct _LISTNODE { DATA_TYPE data; //节点的数据体 struct _LISTNODE *prev; //前一节点的指针 struct _LISTNODE *next; //下一节点的指针 }LISTNODE, *PLISTNODE; //定义链表的基本操作 //创建链表函数 PLISTNODE LIST_Create(); //搜索指定关键字项 PLISTNODE LIST_Search(PLISTNODE list, DATA_TYPE key); //删除指定项 BOOL LIST_Delete(PLISTNODE list, PLISTNODE del); //删除头节点 BOOL LIST_DeleteHead(PLISTNODE list); //删除尾节点 BOOL LIST_DeleteTail(PLISTNODE list); //删除所有节点 BOOL LIST_DeleteAll(PLISTNODE list); //指定项前插入 BOOL LIST_Insert(PLISTNODE list, PLISTNODE pos, DATA_TYPE key); //链表头插入 BOOL LIST_InsertHead(PLISTNODE list, DATA_TYPE key); //链表尾插入 BOOL LIST_InsertTail(PLISTNODE list, DATA_TYPE key); //链表是否为空 BOOL LIST_IsEmpty(PLISTNODE list); //销毁链表 BOOL LIST_Destroy(PLISTNODE list); #endif //实现代码 #include "list.h" #include <stdio.h> #include <stdlib.h> /* 功能: 创建双向链表的头结点 参数: NULL 返回值: 指向头结点的指针 */ PLISTNODE LIST_Create() { PLISTNODE headList; //头结点分配 headList = (PLISTNODE)malloc(sizeof(LISTNODE)); if (NULL == headList) { printf("内存分配错误!/n"); return NULL; } //数据初始化 headList->prev = headList; headList->next = headList; return headList; } /* 功能: 搜索指定关键字的节点 参数: list 所要搜索链表的头结点指针 key 搜索节点的关键字 返回值: 搜索到节点的指针 */ PLISTNODE LIST_Search(LISTNODE *list, DATA_TYPE key) { //有效性检测 if (NULL == list) { return NULL; //链表为空也即找不到 } PLISTNODE pNode; pNode = list->next; while (pNode != list && pNode->data != key) { pNode = pNode->next; } return pNode; } /* 功能: 删除链表指定项 参数: list 将删除指定项的链表 del 指向删除项的指针 返回值: 删除项的数据 */ BOOL LIST_Delete(PLISTNODE list, PLISTNODE del) { //有效性检测 if (NULL == list || NULL == del) { return FALSE; } //删除 del->prev->next = del->next; del->next->prev = del->prev; free(del); del = NULL; return TRUE; } /* 功能: 删除头节点 参数: 返回值: */ BOOL LIST_DeleteHead(PLISTNODE list) { //有效性检测 if (NULL == list) { return FALSE; } return LIST_Delete(list, list->next); } /* 功能: 删除尾节点 参数: 返回值: */ BOOL LIST_DeleteTail(PLISTNODE list) { //有效性检测 if (NULL == list) { return FALSE; } return LIST_Delete(list, list->prev); } /* 功能: 删除所有节点 参数: 返回值: */ BOOL LIST_DeleteAll(PLISTNODE list) { //有效性检测 if (NULL == list) { return FALSE; } PLISTNODE pNode; while (list->prev != list) { pNode = list->prev; list->prev = list->prev->prev; free(pNode); pNode = NULL; } pNode = NULL; list->next = list->prev = list; return TRUE; } /* 功能: 尾部插入 参数: list 将插入的链表 key 插入节点的数据值 返回值: NULL */ BOOL LIST_InsertTail(PLISTNODE list, DATA_TYPE key) { //有效性检查 if (NULL == list) { return FALSE; } PLISTNODE pNew; pNew = (PLISTNODE)malloc(sizeof(LISTNODE)); if (NULL == pNew) { return FALSE; } pNew->data = key; pNew->next = NULL; pNew->prev = NULL; //插入新节点 if (list == list->next) { list->next = list->prev = pNew; pNew->next = pNew->prev = list; } else { list->prev->next = pNew; pNew->prev = list->prev; pNew->next = list; list->prev = pNew; } return TRUE; } /* 功能: 链表头插入 参数: 返回值: */ BOOL LIST_InsertHead(PLISTNODE list, DATA_TYPE key) { //有效性检查 if (NULL == list) { return FALSE; } return LIST_Insert(list, list->next, key); } /* 功能: 指定位置前插入 参数: 返回值: */ BOOL LIST_Insert(PLISTNODE list, PLISTNODE pos, DATA_TYPE key) { //有效性检查 if (NULL == list) { return FALSE; } PLISTNODE pNew; pNew = (PLISTNODE)malloc(sizeof(LISTNODE)); if (NULL == pNew) { return FALSE; } pNew->data = key; pNew->next = NULL; pNew->prev = NULL; //插入新节点 if (list == list->next) { list->next = list->prev = pNew; pNew->next = pNew->prev = list; } else { pNew->next = pos; pos->prev->next = pNew; pNew->prev = pos->prev; pos->prev = pNew; } return TRUE; } /* 功能: 链表空检验 参数: 返回值: */ BOOL LIST_IsEmpty(PLISTNODE list) { return list->prev == list->next; } /* 功能: 链表销毁 参数: 返回值: */ BOOL LIST_Destroy(PLISTNODE list) { BOOL retVal = TRUE; //有效性检验 if (NULL == list) { return FALSE; } retVal = LIST_DeleteAll(list); free(list); list = NULL; return retVal; }