双向链表的实现3

这里进行链表的测试:

1)测试函数:

int lst_test(void)
{
	int i;
	list *head, *new;

	printf("%s begin:\n", __func__);	
		
	for (i = 0; i < LST_COUNT; i++)
	{
		if (i == 0)
		{
			head = create();
			head->p_data = (int *)malloc(sizeof(int));
			
		    *((int *)(head->p_data)) = 0;
			
			continue;
		}

		new = (list*)malloc(sizeof(list));
		if (new == NULL)
		{
			perror("alloc list node error!\n");
			return -1;
		}
		
		new->p_data = (int *)malloc(sizeof(int));

		if (1 == g_perf_on)
		{
			if (i < 20)
				*((int *)(new->p_data)) = rand() % 1000;
			else
				*((int *)(new->p_data)) = 899777;
		}
		else
		{
			*((int *)(new->p_data)) = rand() % LST_COUNT;
		}

		add_tail(head, new);
	}

	//print out list;
	if (LST_COUNT <= 100)
		print_lst(head);

	//delete one node;
	//int value = 4;
	//del_node(head, (void *)(&value));
	
	//add node;
	/*	
	int dat0 = 8, dat1 = 1000;
	printf("add node:\n");
	add_node(head, (void *)&dat0, (void *)&dat1);
	//*/

	//sort list;
	///*
	if ( 1 == g_perf_on )
	{	
		sort_lst(head, 0);

		if (LST_COUNT <= 100)
		{
			printf("sorted list 0:\n");
			print_lst(head);
		}

		printf("sorted list -1:\n");
		sort_lst(head, -1);
		
		if (LST_COUNT <= 100)
			print_lst(head);
	}
	
	//*/
	//reverse list;
	//reverse_lst(&head);
	//print_lst_from_tail(head);

	free_lst(head);

	printf("%s end!\n", __func__);	
	
	return 0;
}

2)主函数及其它相关函数:

void usage(const char *str)
{
	printf("\n\tUsage:\n");
	printf("\t%s [-p | [ -p --count <N>]]\n", str);
	printf("\tExample:\n");
	
	printf("\t%s\n", str);
	printf("\tprint random array of data stored in the list;\n");

	printf("\t%s -p\n", str);
	printf("\tbubble sort performance testing;\n");

	printf("\t%s -p --count <N>\n", str);
	printf("\tbubble sort performance testing, the list has N nodes;\n");

	printf("\n");
}

//Linux/Unix平台可以使用系统函数getopt(),详细请使用man 3 getopt;
int parse_args(int cnt, char **pptr)
{
	if (cnt == 1)
	{
		return 1;
	}
	else if (cnt == 2)
	{
		if ( 0 == strncmp("-p", pptr[1], strlen("-p")) )
		{	
			g_perf_on = 1;
			return 1;
		}
		else
		{
			perror("argument error!\n");
			return -1;
		}																
	}
	else if (cnt == 4)
	{
		if ( 0 == strncmp("-p", pptr[1], strlen("-p") ) && \
			 0 == strncmp("--count", pptr[2], strlen("--count")) )
		{
			LST_COUNT = atoi(pptr[3]);
			if (LST_COUNT > 0)
			{	
				g_perf_on = 1;
				return 1;
			}
			else
			{	
				return -1;
			}
		}
		
	}
}


int main(int argc, char *argv[])
{
	if (argc != 1 && argc != 2 && argc != 4)
	{
		usage(argv[0]);
		return 1;
	}

	//parse arguments;
	if ( -1 == parse_args(argc, argv) )
	{
		printf("arguments not correct!\n");
		usage(argv[0]);
		return -1;
	}

	printf("list node count: %d\n", LST_COUNT);
	lst_test();

	return 0;
}


至此, 粗略地实现了双向链表。

完整代码下载请参考我的资源:双向链表的实现


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值