Exemplo n.º 1
0
int CircleList_Insert(CircleList *list, CircleListNode *node, int pos)   //O(n)
{
	TCircleList *slist = (TCircleList *)list;
	int ret = (slist != NULL) && (pos >= 0) && (node != NULL);
	int i = 0;

	if(ret)
	{
		CircleListNode *current = (CircleListNode *)slist;

		for(i = 0; (i < pos) && (current->next != NULL); i++)
		{
			current = current->next;
		}

		node->next = current->next;
		current->next = node;

		if(slist->length == 0)
		{
			slist->slider = node;
			node->next = node;
		}

		slist->length++;

		if(current == (CircleListNode *)slist)
		{
			CircleListNode *last = CircleList_Get(slist,slist->length-1);
			last->next = current->next;
		}
	}

	return ret;
}
Exemplo n.º 2
0
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos) // O(n)
{ 
    TCircleList* sList = (TCircleList*)list;
    int ret = (sList != NULL) && (pos >= 0) && (node != NULL);
    int i = 0;
    
    if( ret )
    {
        CircleListNode* current = (CircleListNode*)sList;
        
        for(i=0; (i<pos) && (current->next != NULL); i++)
        {
            current = current->next;
        }
        
        node->next = current->next;
        current->next = node;
        
        if( sList->length == 0 )//修改: 原来node->next = node删除 对插入第一个元素时修正
        {
            sList->slider = node;
        }
        
        sList->length++;
        
        if( current == (CircleListNode*)sList )//添加: 判断是不是第0个位置 做出修正
        {
            CircleListNode* last = CircleList_Get(sList, sList->length - 1);
            
            last->next = current->next;//修正让最后一个元素的next指向表头的next
        }
    }
    
    return ret;
}
Exemplo n.º 3
0
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);
		log("last->itme=%d\n", last->item);
		for (i=0; i<pos; i++)
			cur = cur->next;
		ret = cur->next;
		cur->next = ret->next;
		list->length --;
		log("length=%d\n", list->length);
		
		if ( ret == list->slider ) {
			list->slider = ret->next;
		}
	
		if ( first == ret ) {
			list->header.next = ret->next;
			last->next = ret->next;
		}
		if ( list->length == 0 ) {
			list->header.next = NULL;
			list->slider = NULL;
		}
	}

	return ret;
}
Exemplo n.º 4
0
int main(int argc, char *argv[])
{
    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;

    int i = 0;

    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, 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_Get(list, i);

        printf("%d\n", pv->v);
    }
    puts(" ");
    CircleList_joseph(list,0,2);

    printf("\n");

    CircleList_Destroy(list);

    return 0;
}
Exemplo n.º 5
0
CircleListNode *CircleList_Delete(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;
		CircleListNode * first = slist->header.next;

		for(i = 0; i < pos; i++)
		{
			current = current->next;
		}

		if(current == (CircleListNode *)slist)
		{
			CircleListNode * last = (CircleListNode *)CircleList_Get(slist,slist->length - 1);
		}

		ret = current->next;
		current->next = ret->next;

		slist->length--;

		if(last != NULL)
		{
			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;
}
Exemplo n.º 6
0
CircleListNode* CircleList_Delete(CircleList* list, int pos) // O(n)
{
    TCircleList* sList = (TCircleList*)list;
    CircleListNode* ret = NULL;
    int i = 0;
    
    if( (sList != NULL) && (pos >= 0) && (sList->length > 0) )//合法性判断 提高程序的健壮性
    {
        CircleListNode* current = (CircleListNode*)sList;
        CircleListNode* last = NULL;
        
        for(i=0; i<pos; i++)
        {
            current = current->next;
        }
        
        if( current == (CircleListNode*)sList )//是否为表头
        {
            last = (CircleListNode*)CircleList_Get(sList, sList->length - 1);
        }
        
        ret = current->next;
        current->next = ret->next;
        
        sList->length--;
        
        if( last != NULL )
        {
            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;
}