循环链表

来源:互联网 发布:淘宝卖家电话隐藏 编辑:程序博客网 时间:2024/06/14 05:21

1.游标的定义 。定义一个当前指针。

2    获取当前游标指向的数据元素。

3   将游标重置指向链表中的第一个数据元素

 4  将游标移动指向到链表中的下一个数据元素。

5  直接指定删除链表中的某个数据元素。



#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



#include "CircleList.h" #include <malloc.h>#include <stdio.h>typedef struct _tag_CircleList{CircleListNode header;CircleListNode* slider;int length;}TCircleList;CircleList* CircleList_Create()   //O(1){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) //O(1){free(list);}void CircleList_Clear(CircleList* list) //O(1){TCircleList* sList = (TCircleList*)list;if(sList != NULL){    sList->length  = 0;    sList->header.next = NULL;sList->slider = NULL;}}int CircleList_Length(CircleList* list) //O(1){TCircleList* sList = (TCircleList*)list;int ret = -1;if(sList != NULL){    ret = sList->length;}return ret;}int CircleList_Insert(CircleList* list,CircleListNode* node,int pos) //O(N){TCircleList* sList = (TCircleList*)list;int ret = (sList != NULL);int i = 0;ret  = ret && (pos>=0) && (node != NULL);if(ret){    CircleListNode* current =  (CircleListNode*)sList;CircleListNode* last =(CircleListNode* )CircleList_Get(sList,sList->length-1);for(i=0;(i<pos)&&(current->next != NULL);i++){current = current->next;}node->next = current->next;current->next=node;if((pos ==0) && (sList->length != 0)){    last->next = node;    }  if(sList->length == 0){sList->slider = node;    node->next = node;}sList->length++;}return ret;}CircleListNode* CircleList_Get(CircleList* list,int pos) //O(N){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++){current = current->next;}ret = current->next;}return ret;}CircleListNode* CircleList_Delete(CircleList* list,int pos) //O(N){TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;CircleListNode* first  = sList->header.next;CircleListNode* last =  (CircleList_Get(sList,sList->length-1));int i = 0;if((sList != NULL) && (pos>=0)){CircleListNode* current =  (CircleListNode*)sList;for(i=0;i<pos;i++){current = current->next;}ret = current->next;current->next = ret->next;sList->length--;if(first == ret){     sList->header.next = ret->next; last->next = ret->next;}if(sList->slider == ret){    sList->slider =  ret->next;}if(sList->length == 0){     sList->header.next = NULL;  sList->slider = NULL;}}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){TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;if(sList != NULL){     sList->slider = sList->header.next; ret =sList->slider;}return ret;}CircleListNode*  CircleList_Current(CircleList* list){TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;if(sList != NULL){ ret =sList->slider;}return ret;}CircleListNode*  CircleList_Next(CircleList* list){TCircleList* sList = (TCircleList*)list;CircleListNode* ret = NULL;if((sList != NULL)&&(sList->slider != NULL)){ ret =sList->slider; sList->slider =ret->next;}return ret;}


#include <stdio.h>#include <stdlib.h>#include "CircleList.h"/* run this program using the console pauser or add your own getch, system("pause") or input loop */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*)&v1, 0);    CircleList_Insert(list, (CircleListNode*)&v2, 0);    CircleList_Insert(list, (CircleListNode*)&v3, 0);    CircleList_Insert(list, (CircleListNode*)&v4, 0);                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));    */    CircleList_Insert(list, (CircleListNode*)&v1, 0);    CircleList_Insert(list, (CircleListNode*)&v2, 0);    CircleList_Insert(list, (CircleListNode*)&v3, 0);    CircleList_Insert(list, (CircleListNode*)&v4, 0);    CircleList_Insert(list, (CircleListNode*)&v5, 0);    CircleList_Insert(list, (CircleListNode*)&v6, 0);    CircleList_Insert(list, (CircleListNode*)&v7, 0);    CircleList_Insert(list, (CircleListNode*)&v8, 0);        for(i=0; i<CircleList_Length(list); i++)    {        struct Value* pv = (struct Value*)CircleList_Next(list);                printf("%d\n", pv->v);    }        printf("\n");        CircleList_Reset(list);        while( CircleList_Length(list) > 0 )    {        struct Value* pv = NULL;                for(i=1; i<3; i++)        {            CircleList_Next(list);        }                pv = (struct Value*)CircleList_Current(list);                printf("%d\n", pv->v);                CircleList_DeleteNode(list, (CircleListNode*)pv);    }        CircleList_Destroy(list);    return 0;}




0 0
原创粉丝点击