Redis 中list的实现(地址传值)

34 篇文章 0 订阅
#include "adlist.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<time.h>

int main()
{
	struct list *t;
	t=listCreate();

	int i;
	char *pb[5];
	char buf[25];
	srand(time(NULL));
	
	char *pd;
	for(i=0;i<5;i++)
	{		
		//Method1:
		//pb[i]=(char*)malloc(sizeof(char)*10);
		//Method2:
		pd=(char*)malloc(sizeof(char)*10);
		sprintf(pd,"test index:%d.",rand()%100);
		
		//Method3:
		//memset(buf,0,25);
		//char buf[25];
		//sprintf(buf,"test index:%d.",rand()%100); 
		//这种方式不行,因为buf的地址在这个for loop里面始终没有发生变化,但是listAddNodeHead这个函数的实现是将buf的地址进行value传递的,
		//因此当遍历list的时候,只能打印出最后listAddNodeHead的value.
		//改进的方法是使用一个指针,对其进行loop一次,malloc一次,这样每个loop,地址都不一样。从而对应的链表中存放的地址也是不一样的。
		//也可以是用指针数组的方法
                t = listAddNodeHead(t,(void*)pd);
		//t = listAddNodeTail(t,(void*)buf);
		if(!t){
			printf("listAddNodeHead error!\n");
			exit(0);
		}
		printf("%s\n",pd);	
		
		//free(pb[i]);
		//free(pd);
	}
	
	free(pd);
	printf("\n");
	
	listNode *p=NULL;
	p=t->head;
	
	if(p->prev==NULL){
		printf("OK\n");
	}
	
	while(p!=NULL)
	{
		printf("%s\n",p->value);
		p=p->next;
	}
	printf("\n");
	
	/*p=t->tail;
	if(p->next==NULL){
		printf("OK\n");
	}
	
	while(p!=NULL)
	{
		printf("%s\n",p->value);
		p=p->prev;
	}
	printf("\n");*/
	
	// #define AL_START_HEAD 0
	// #define AL_START_TAIL 1
	
	
	listIter *it=NULL;
	listNode *node=NULL;
	it = listGetIterator(t,0);
	
	while((node=listNext(it))!=NULL)	
	{
		printf("%s\n",node->value);
		listDelNode(t,node);
	}
	
	listReleaseIterator(it);
	listRelease(t);


	return 0;
}
这只是一个测试的文件,具体的内容请看redis的源代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值