目錄:
- 代碼:
- 分析:
- 匯編:
代碼:
CircleList.h
#ifndef _CIRCLELIST_H_
#define _CIRCLELIST_H_typedef void CircleList;typedef struct _tag_CircleListNode CircleListNode;struct _tag_CircleListNode{CircleListNode *next;};CircleList * CircleList_Create();void CircleList_Destroy(CircleList* list);void CircleList_Clear(CircleList* list);int CircleList_Length(CircleList* list);int CircleList_Insert(CircleList* list, CircleListNode* node, int pos);CircleListNode* CircleList_Get(CircleList* list, int pos);CircleListNode* CircleList_Delete(CircleList* list, int pos);CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);CircleListNode* CircleList_Reset(CircleList* list);CircleListNode* CircleList_Current(CircleList* list);CircleListNode* CircleList_Next(CircleList*list);#endif
CircleList.c
#include<stdio.h>
#include<malloc.h>
#include"CircleList.h"typedef struct _tag_CircleList{CircleListNode header;//頭節點CircleListNode* slider;int length;
}TCircleList;CircleList * CircleList_Create(){//定義創建表函數TCircleList * ret = (TCircleList*)malloc(sizeof(TCircleList));if (ret != NULL){ret->length = 0;ret->header.next = NULL;ret->slider = NULL;}return ret;
}void CircleList_Destroy(CircleList * list){//定義銷毀表函數free(list);
}void CircleList_Clear(CircleList* list){//定義重設表屬性函數TCircleList* sList = (TCircleList*)list;if (sList != NULL){sList->length = 0;sList->header.next = NULL;sList->slider = NULL;}
}int CircleList_Length(CircleList * list){//定義獲取表當前長度函數TCircleList *sList = (TCircleList*)list;int ret = -1;if (sList != NULL){ret = sList->length;}return ret;
}int CircleList_Insert(CircleList * list, CircleListNode* node, int pos){//定義插入節點函數TCircleList *sList = (TCircleList*)list;int ret = (sList != NULL) && (pos >= 0) && (node != NULL);//判斷表與節點是否為空和pos是否正常int i = 0;if (ret){CircleListNode* current = (CircleListNode*)sList; //取得表的header元素地址//取得插入節點位置的前一個節點//current->next == NULL 表示是第一個插入的節點//注意:這沒有對pos判斷,pos大于length時會循環for (i = 0; (i < pos) && (current->next != NULL); i++){current = current->next;}//注意:插入第一個節點后,再插入的節點如果不是第一個位置才能正常循環//可以在鏈表結構加一個尾節點指針變量保持指向尾節點,每次尾節點更改后再更新node->next = current->next;//將原本在pos位置的節點賦給新插入節點的nextcurrent->next = node;//將插入節點賦給插入節點位置的前一個節點的nextif (sList->length == 0){ //如果是第一個插入的節點//注意:插入第一個節點后,再插入的節點如果是第一個位置slider不會更新還是第一次插入的第一個節點sList->slider = node;//將第一個插入節點賦給slider node->next = node;//將第一個插入節點的next指向自身(實現循環) }sList->length++;//長度增加}return ret;
}CircleListNode* CircleList_Get(CircleList* list, int pos){//定義獲取節點函數TCircleList * sList = (TCircleList*)list;CircleListNode* ret = NULL;int i = 0;if ((sList != NULL) && (pos >= 0)){CircleListNode* current = (CircleListNode*)sList;for (i = 0; i < pos; i++){ //取得前一個節點//注意:這沒有對pos判斷,pos大于length時會循環current = current->next;}ret = current->next; //取得要獲取的節點}return ret;
}CircleListNode* CircleList_Delete(CircleList* list, int pos){//定義根據下標刪除節點函數TCircleList *sList = (TCircleList*)list;CircleListNode * ret = NULL;int i = 0;if ((sList != NULL) && (pos >= 0)){//判斷表是否為空與pos是否正常CircleListNode* current = (CircleListNode*)sList;//指向頭節點CircleListNode* first = sList->header.next;//指向第一個節點CircleListNode* last = (CircleListNode*)CircleList_Get(sList, sList->length-1);//指向最后一個節點for (i = 0; i < pos; i++){//找到要刪除位置的前一個位置current = current->next;}ret = current->next;//指向要刪除節點current->next = ret->next;//將要刪除節點的next賦給上一節點的nextsList->length--;//長度減少if (first == ret){ //如果是第一個節點//這一步好像多余,上面current就是headersList->header.next = ret->next;//將頭節點指向第一個節點的下一個last->next = ret->next;//將最后一個節點的next指向第一個節點的下一個實現循環}if (sList->slider == ret){//如果刪除的節點是第一個插入的節點sList->slider = ret->next;//刪除節點的下個節點賦給slider}if (sList->length == 0){//如果長度等于0,表示鏈表沒有數據了sList->header.next = NULL; //重置第一個節點的指向sList->slider = NULL;//重置slider}}return ret;//返回刪除節點
}CircleListNode* CircleList_DeleteNode(CircleList * list, CircleListNode * node){//定義根據節點刪除節點函數TCircleList* sList = (TCircleList*)list;CircleListNode *ret =NULL;int i = 0;if (sList != NULL){//判斷表是否為空CircleListNode* current = (CircleListNode*)sList;//指向頭節點for (i = 0; i < sList->length; i++){if (current->next == node){//找到刪除節點的上一個節點ret = current->next;//指向刪除節點break; //找到后跳出循環查找}current = current->next;}if (ret != NULL){//如果有該節點CircleList_Delete(sList, i);//將下標轉去執行刪除}}return ret;//返回刪除節點
}CircleListNode* CircleList_Reset(CircleList* list){//定義重置slider指向的函數TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;if (sList != NULL){//如果表不為空sList->slider = sList->header.next;//將第一個節點賦給sliderret = sList->slider;}return ret;//返回slider}CircleListNode* CircleList_Current(CircleList* list){//定義slider當前指向節點函數TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;if (sList != NULL){ret = sList->slider;}return ret;//返回slider
}CircleListNode* CircleList_Next(CircleList *list){//定義slider下移一個節點函數TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;if ((sList != NULL) && (sList->slider != NULL)){//判斷表不為空與slider不為空ret = sList->slider;sList->slider = ret->next;//將slider的next賦給slider}return ret;//返回slider;
}
main.c
#include<stdio.h>
#include<stdlib.h>
#include"CircleList.h"struct Value{CircleListNode header;//必須放在第一個元素int v;
};
int main(int argc, char *argv[]){int i = 0;CircleList* list = CircleList_Create();struct Value v1;struct Value v2;struct Value v3;struct Value v4;struct Value v5;struct Value v6;struct Value v7;struct Value v8;v1.v = 1;v2.v = 2;v3.v = 3;v4.v = 4;v5.v = 5;v6.v = 6;v7.v = 7;v8.v = 8;CircleList_Insert(list, (CircleListNode*)&v1, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v2, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v3, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v4, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v5, 5);CircleList_Delete(list, 0);for (i = 0; i < 2 * CircleList_Length(list); i++){struct Value* pv = (struct Value*)CircleList_Get(list, i);printf("%d\n", pv->v);}printf("\n");while (CircleList_Length(list)>0){struct Value*pv = (struct Value*)CircleList_Delete(list, 0);printf("%d\n", pv->v);}printf("\n");CircleList_Insert(list, (CircleListNode*)&v1, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v2, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v3, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v4, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v5, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v6, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v7, CircleList_Length(list));CircleList_Insert(list, (CircleListNode*)&v8, CircleList_Length(list));for (i = 0; i < CircleList_Length(list); i++){struct Value* pv = (struct Value*)CircleList_Next(list);printf("%d\n", pv->v);}getchar();return 1;
}
分析:
匯編: