单向循环链表实例

来源:互联网 发布:武汉破获一起新型网络 编辑:程序博客网 时间:2024/06/04 17:46

游标:循环链表中的“当前”指针,这个指针称为游标,可以通过游标访问链表中的所有元素:

增加:

获取游标所指的数据元素重置游标移动至下一个元素直接指定删除的节点

刚开始游标为空,当插入多个节点后,游标指向第一次插入的那个节点。

实例如下:

//circlelist.h

#ifndef __CIRCLELIST_H__#define __CIRCLELIST_H__typedef struct circlelistnode{    struct circlelistnode *next;    int item;}CircleListNode;typedef struct circlelist{    CircleListNode header;    int length;}CircleList;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);#endif //__CIRCLELIST_H__

//circlelist.c文件

#include <stdlib.h>#include "circlelist.h"//创建CircleList *CircleList_Create(){    CircleList *ret = NULL;    ret = malloc(sizeof(CircleList));    if(ret != NULL)    {        ret->length = 0;        ret->header.next = NULL;    }    return ret;}//销毁void CircleList_Destroy(CircleList *list){    free(list);}//清空void CircleList_Clear(CircleList *list){    if( list != NULL )    {        list->length = 0;         list->header.next = NULL;     }}//求长度int CircleList_Length(CircleList *list){    int ret = -1;    if( list != NULL )    {        ret = list->length;     }    return ret;}//插入int CircleList_Insert(CircleList *list, CircleListNode *node, int pos){    int ret = (list!=NULL) && (node != NULL) && (pos>=0);    if( ret )    {        int i;        CircleListNode *cur = (CircleListNode *)list;        for(i=0; i<pos; i++)  //让cur遍历        {            cur = cur->next;         }        node->next = cur->next;        cur->next = node;        if( list->length == 0 )     //只有一个节点的时候        {            node->next = node; //自己指向自己        }        list->length++;        if(cur == (CircleListNode *)list)   //实现每次都可以插到第0个位置; 条件是判断是否有一个节点        {            CircleListNode *last = CircleList_Get(list, list->length-1);        //获得最后一个节点.            last->next = node;  //让最后一个节点指向刚排好链表的第0个节点        }    }    return ret;}//获得CircleListNode *CircleList_Get(CircleList *list, int pos){    CircleListNode *ret = NULL;    if(list != NULL && pos>=0)    {         int i;         CircleListNode *cur = (CircleListNode *)list;         for( i=0; i<pos; i++ )         {             cur= cur->next;          }         ret = cur->next;    }    return ret;}//删除CircleListNode *CircleList_Delete(CircleList *list,int pos){    CircleListNode *ret = NULL;    if(list!=NULL && pos>=0)    {        int i;        CircleListNode *cur = (CircleListNode *)list;        CircleListNode *first = list->header.next;        CircleListNode *last = CircleList_Get(list,list->length-1);        for(i=0; i<pos; i++)        {            cur = cur->next;         }        ret = cur->next;        //删除的位置赋给了ret        cur->next = ret->next;        list->length--;        if( first == ret )  //删除的是第一个位置        {            list->header.next = ret->next;            last->next = ret->next;        }        if( list->length == 0)        {            list->header.next = NULL;         }    }    return ret;}

//main.c文件

#include <stdio.h>#include <stdlib.h>#include "circlelist.h"int main( void ){    int i;    CircleList *list = CircleList_Create();    CircleListNode n1 = {.next=NULL, .item=1};    CircleListNode n2 = {.next=NULL, .item=2};    CircleListNode n3 = {.next=NULL, .item=3};    CircleListNode n4 = {.next=NULL, .item=4};    CircleListNode n5 = {.next=NULL, .item=5};    CircleList_Insert(list, &n1, 0);    CircleList_Insert(list, &n2, 0);    CircleList_Insert(list, &n3, 0);    CircleList_Insert(list, &n4, 0);    CircleList_Insert(list, &n5, 7);    //当把5插入到第7个位置的时候他会循环回去    printf("length= %d\n", CircleList_Length(list));    for (i=0; i<CircleList_Length(list); i++) {        printf("%d  ", CircleList_Get(list, i)->item);  //获得,并打印出来    }    printf("\n");    while (CircleList_Length(list) > 0) {        printf("%d ", CircleList_Delete(list, 0)->item); //一一删除    }    printf("\n");    CircleList_Destroy(list);    return 0;}

//Makefile

CC = gcc -gmain : circlelist.o main.o    $(CC) $^ -o $@.PHANY:main cleanclean:    rm -rf *.o main

案例二:

用单向循环链表来实现一个小游戏,题目是一圈人数123,当数到3的那个人退出,打印出退出的先后顺序,这里我们的人数为8

案例如下;

在头文件中加上

//加一个游标slidertypedef struct criclelist {                                                       CircleListNode header;      CircleListNode *slider;      int length;}CircleList;CircleListNode *CircleList_Reset(CircleList *list);CircleListNode *CircleList_Next(CircleList *list);CircleListNode *CircleList_Current(CircleList *list);CircleListNode *CircleList_DeleteNode(CircleList *list, CircleListNode *node);

在circlelist.c文件中加上:

//重新组合CircleListNode *CircleList_Reset(CircleList *list){    CircleListNode *ret = NULL;    if ( list != NULL ) {        list->slider = list->header.next;        ret = list->slider;    }    return ret;}//返回指向下一个的指针CircleListNode *CircleList_Next(CircleList *list){    CircleListNode *ret = NULL;    if ( list!=NULL && list->slider!=NULL ) {        ret = list->slider;        list->slider = ret->next;    }    return ret;}//CircleListNode *CircleList_Current(CircleList *list){    CircleListNode *ret = NULL;    if ( list != NULL )        ret = list->slider;    return ret;}//删除数到3的那个节点CircleListNode *CircleList_DeleteNode(CircleList *list, CircleListNode *node){    CircleListNode *ret = NULL;    if ( list!=NULL && node!=NULL ) {        int i;        CircleListNode *cur = (CircleListNode*)list;        for (i=0; i<list->length; i++ ) {            if ( cur->next == node) {                ret = cur->next;                break;            }            cur = cur->next;        }        if ( ret != NULL) {            CircleList_Delete(list, i);        }    }    return ret;}

在主函数换为:

#include <stdio.h>#include <stdlib.h>#include "circlelist.h"int main( void ){//创建    CircleList *list = CircleList_Create();    CircleListNode n1 = {.next=NULL, .item=1};    CircleListNode n2 = {.next=NULL, .item=2};    CircleListNode n3 = {.next=NULL, .item=3};    CircleListNode n4 = {.next=NULL, .item=4};    CircleListNode n5 = {.next=NULL, .item=5};    CircleListNode n6 = {.next=NULL, .item=6};    CircleListNode n7 = {.next=NULL, .item=7};    CircleListNode n8 = {.next=NULL, .item=8};//插入    CircleList_Insert(list, &n1, CircleList_Length(list));    CircleList_Insert(list, &n2, CircleList_Length(list));    CircleList_Insert(list, &n3, CircleList_Length(list));    CircleList_Insert(list, &n4, CircleList_Length(list));    CircleList_Insert(list, &n5, CircleList_Length(list));    CircleList_Insert(list, &n6, CircleList_Length(list));    CircleList_Insert(list, &n7, CircleList_Length(list));    CircleList_Insert(list, &n8, CircleList_Length(list));    while( CircleList_Length(list) > 0)    {        int i;        for(i=1; i<3; i++)        {            CircleList_Next(list);         }        CircleListNode *node = CircleList_Current(list);        printf("%d ",node->item);        CircleList_DeleteNode(list,node);    }    printf("\n");    CircleList_Destroy(list);    return 0;}
0 1
原创粉丝点击