400字范文,内容丰富有趣,生活中的好帮手!
400字范文 > 游戏筑基开发之环形链表及其基本功能(C语言)

游戏筑基开发之环形链表及其基本功能(C语言)

时间:2020-11-17 04:25:36

相关推荐

游戏筑基开发之环形链表及其基本功能(C语言)

C语言环形链表

主要使用结构体、一级指针、二级指针等基本知识实现。功能包括:尾插法、任意插入、任意删除、输出数据等。

数据结构如下:

//环形链表struct tagCircularListNode{int v;//数据存储struct tagCircularListNode *prior;//前驱节点struct tagCircularListNode *next;//后继节点};typedef struct tagCircularList{struct tagCircularListNode *nStart;//头节点标记位struct tagCircularListNode *nEnd;//尾节点标记位int Size;//环形链表大小int MaxSize;//环形链表最大值}TCircularList, *PTCircularList;

具体实现如下:

待优化,仅供参考。

#include<stdio.h>//环形链表struct tagCircularListNode{int v;struct tagCircularListNode *prior;struct tagCircularListNode *next;};typedef struct tagCircularList{struct tagCircularListNode *nStart;struct tagCircularListNode *nEnd;int Size;int MaxSize;}TCircularList, *PTCircularList;//初始化static int CircularListInit(PTCircularList *ppv,int maxSize){if ((*ppv) != NULL && maxSize != (*ppv)->MaxSize)CircularListFree(ppv);PTCircularList pv = malloc(sizeof(TCircularList));pv->nEnd = NULL;pv->nStart = pv->nEnd;pv->Size = 0;pv->MaxSize = maxSize;*ppv = pv;pv = NULL;return 1;}//尾插入static int CircularListAdd(PTCircularList pv, int v){if (pv == NULL)return 0;struct tagCircularListNode* pvNode = malloc(sizeof(struct tagCircularListNode));struct tagCircularListNode* headNode = pv->nStart;pvNode->v = v;if (pv->Size == 0){pvNode->prior = pvNode;pvNode->next = pvNode;pv->nStart = pvNode;pv->nEnd = pv->nStart;}else if (pv->Size >= pv->MaxSize){int count = -1;while ((++count) != (pv->Size % pv->MaxSize))headNode = headNode->next;pv->nStart = headNode->next;pv->nEnd = headNode;headNode->v = v;}else{pvNode->prior = pv->nEnd;pv->nEnd->next = pvNode;pv->nEnd = pvNode;pv->nEnd->next = pv->nStart;pv->nStart->prior = pv->nEnd;}pv->Size++;pvNode = NULL;return 1;}//任意插入static int CircularListPush(PTCircularList pv, int index, int v){if (pv == NULL || index > pv->MaxSize)return 0;struct tagCircularListNode* pvNode = malloc(sizeof(struct tagCircularListNode));struct tagCircularListNode* headNode = pv->nStart;pvNode->v = v;if (index == 0 && pv->Size < pv->MaxSize){pvNode->prior = pv->nEnd;pvNode->next = pv->nStart;pv->nStart->prior = pvNode;pv->nEnd->next = pvNode;pv->nStart = pvNode;}else if (pv->Size >= pv->MaxSize){int count = -1;while ((++count) != index)headNode = headNode->next;pv->nStart = headNode->next;pv->nEnd = headNode;headNode->v = v;}else{struct tagCircularListNode* headNode = pv->nStart;int count = -1;while (headNode != NULL && (++count) != index - 1)headNode = headNode->next;pvNode->next = headNode->next;headNode->next->prior = pvNode;headNode->next = pvNode;pvNode->prior = headNode;headNode = NULL;}pv->Size++;return 1;}//任意删除static int CircularListDelete(PTCircularList pv, int index){if (pv == NULL || index > (pv->Size % pv->MaxSize) || pv->Size == 0)return 0;int count = -1;struct tagCircularListNode* headNode = pv->nStart;struct tagCircularListNode* temp = NULL;while (headNode != NULL && (++count) != index - 1 && index != 0)headNode = headNode->next;if (index == 0){temp = pv->nStart;pv->nStart = temp->next;pv->nStart->prior = pv->nEnd;pv->nEnd->next = pv->nStart;free(temp);}else{temp = headNode->next;temp->next->prior = headNode;headNode->next = temp->next;pv->nEnd = headNode;free(temp);}temp = NULL;pv->Size--;return 1;}//释放内存static int CircularListFree(PTCircularList *ppv){if (*ppv == NULL)return 0;struct tagCircularListNode* headNode = (*ppv)->nStart;while (headNode->next != (*ppv)->nEnd){headNode = headNode->next;free((*ppv)->nStart);(*ppv)->nStart = headNode;}free(headNode);headNode = NULL;(*ppv)->nEnd = NULL;(*ppv)->nStart = NULL;(*ppv)->Size = 0;return 1;}//打印数据,从左至右static int LeftPrintData(PTCircularList pv){if (pv == NULL || pv->Size == 0)return 0;struct tagCircularListNode *Node = pv->nStart;if (Node->next == pv->nStart){printf("%4d", Node->v);}else{while (Node->next != pv->nStart){printf("%4d", Node->v);Node = Node->next;}printf("%4d", Node->v);}printf("%\n");return 1;}//打印数据,从右至左static int RightPrintData(PTCircularList pv){if (pv == NULL || pv->Size == 0)return 0;struct tagCircularListNode *Node = pv->nEnd;if (Node->prior == pv->nEnd){printf("%4d", Node->v);}else{while (Node->prior != pv->nEnd){printf("%4d", Node->v);Node = Node->prior;}printf("%4d", Node->v);}printf("%\n");return 1;}//测试int main(){int max = 10;PTCircularList pv = NULL;CircularListInit(&pv, 10);CircularListAdd(pv, 3);CircularListAdd(pv, 6);CircularListAdd(pv, 1);CircularListAdd(pv, 10);CircularListAdd(pv, 25);CircularListAdd(pv, 12);CircularListAdd(pv, 8);CircularListAdd(pv, 16);CircularListAdd(pv, 7);CircularListAdd(pv, 9);CircularListPush(pv, 2, 16);CircularListPush(pv, 0, 16);RightPrintData(pv);return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。