又写了一遍单链表

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef enum{FALSE, TRUE, ERROR} BOOL;

typedef struct _Data
{
	int id;
	char *name;
}Data;

typedef struct _Node
{
	Data data;
	struct _Node *next;
}Node;

Node *CreateHead(Node **node)
{
	if(NULL == node)
	{
		return NULL;
	}
	
	Node *head = (Node *)malloc(sizeof(Node)/sizeof(char));
	if(NULL == head)
	{
		//分配头结点head的空间失败
		return NULL;
	}
	
	head->data.name = (char *)malloc(sizeof(char)*15);
	if(head->data.name == NULL)
	{
		//分配指针name的空间失败
		free(head);
		return NULL;
	}
	
	head->data.id = 0;
	strcpy(head->data.name,"head");
	head->next = NULL;
	
	*node = head;
	
	return head;
}

BOOL Insert_tail(Node *head, Data data)
{
	if(NULL == head)
	{
		return ERROR;
	}
	
	Node *node = (Node *)malloc(sizeof(Node)/sizeof(char));
	if(NULL == node)
	{
		return ERROR;
	}
	node->data.name = (char *)malloc(sizeof(char)*15);
	
	node->data.id = data.id;
	stpcpy(node->data.name, data.name);
	node->next = NULL;
	
	Node *tmp = head;
	while(tmp->next != NULL)
	{
		tmp = tmp->next;
	}
	
	tmp->next = node;
	
	return TRUE;
}

void Print_Data(Data data)
{
	printf("id = %-4d,name = %s\n", data.id, data.name);
}

void Display(Node *head)
{
	if(NULL == head)
		return ;
	
	Node *tmp = head->next;
	
	while(tmp != NULL)
	{
		Print_Data(tmp->data);
		tmp = tmp->next;
	}
	
}

BOOL Delete_Data(Node *head, Data data)
{
	if(NULL == head)
		return ERROR;
	
	
	Node *tmp = head;
	
	while(tmp->next != NULL)
	{
		if(strcmp(tmp->next->data.name, data.name) == 0)
		{
			Node *p = tmp->next;
			tmp->next = p->next;
			free(p->data.name);
			free(p);
			
			return FALSE;
		}
		
		tmp = tmp->next;
	}
	
	return TRUE;
	
}

BOOL Updata_Data(Node *head, Data data)
{
	if(NULL == head)
	{
		return ERROR;
	}
	
	Node *tmp = head;
	
	while(tmp->next != NULL)
	{
		if(strcmp(tmp->next->data.name, data.name) == 0)
		{
			printf("名字修改为:");
			scanf("%s", tmp->next->data.name);
			printf("修改成功\n");
			
			return TRUE;
		}
		
		tmp = tmp->next;
	}
	
	
}

int Length(Node *head)
{
	if(NULL == head)
	{
		return -1;
	}
	int length = 0;
	
	Node *tmp = head;
	while(tmp->next != NULL)
	{
		length++;
		tmp = tmp->next;
	}
	
	
	return length;
}

void Reverse(Node *head)
{
	if(NULL == head || NULL == head->next || NULL == head->next->next)
	{
		return ;
	}
	
	Node *pre = head->next;
	Node *cur = pre->next;
	Node *tmp = cur->next;
	
	while(cur != NULL)
	{
		tmp = cur->next;
		cur->next = pre;
		pre = cur;
		cur = tmp;
	}
	
	head->next->next = NULL;
	head->next = pre;
}


int main()
{
	Node *head2 = NULL;
	Node *head1 = CreateHead(&head2);
	
	if(NULL == head1)
	{
		printf("head1初始化失败\n");
	}
	if(NULL == head2)
	{
		printf("head2初始化失败\n");
	}
	
	Data data1;
	data1.id = 1;
	data1.name = (char *)malloc(sizeof(char)*15);
	strcpy(data1.name, "zoujie");
	
	Data data2;
	data2.id = 2;
	char name2[15] = "luzhiwei";
	data2.name = name2;
	
	
	Insert_tail(head1, data1);
	Display(head1);
	printf("1--------------------------\n");
	
	Insert_tail(head1, data2);
	Display(head1);
	printf("length = %d\n", Length(head1));
	printf("2--------------------------\n");
	
	Reverse(head1);
	Display(head1);
	printf("3--------------------------\n");
	
	Delete_Data(head1, data1);
	Display(head1);
	printf("4--------------------------\n");
	
	Updata_Data(head1, data2);
	Display(head1);
	printf("length = %d\n", Length(head1));
	printf("5--------------------------\n");
	

	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个算法是平时玩自绘的时候想到的,不知道算不算虚表,不过我感觉应该算的上效率很高的了。这个算法只适用每个项目高度都一样的情况,比如常见的列表框、超级列表框都是等高的,不等高的比如气泡聊天框、QQ列表框、酷狗的播放列表、QQ登录界面的账号选择框.... 进入正题,我们都知道,自绘列表框其实就是绘制一个个收尾连接一起的矩形,然后在矩形里填充各种数据,图标、标题、进度条...然后滚动显示就是把各个矩形向上或向下偏移     这样一个列表框就完成了。 不过这样绘制出来的列表框效率很低,数据小的时候不明显,当数据量达到上万啥的,效率就很明显了,而且还特别占CPU。 怎样提高绘制效率呢?那就是利用虚表算法,通熟易懂就是只画看得见的,超出组件范围的就不画,这样效率就大大提高了。 如上图,2个箭头里的就是可视区域,因为每个项目的高度是一样的,可以利用滚动条来算出起始绘制索引,也就是顶端的那个项目。 在这里假设项目高度是10,滚动条此时的位置也是10,说明整个列表框整体已经向上偏移了10,也就是项目1刚好看不到,这时你看到的效果应该是图下的。 在比如这时滚动条在15的位置,你看到的效果应该是第2个项目的一半超出范围,只能看到下面一部分开始。 多试验几次,起始索引可以这样算出  滚动条的位置 / 项目高度 + 1 把第一次的值代进去  10 / 10 + 1 = 2  正确 第二次的值代进去      15 / 10 + 1 = 2.5  为什么会有小数呢,在看看上面的图片  发现后面的小数就是起始索引的偏移。 偏移可以单独这样算出   滚动条的位置 mod 项目高度  也就是取余。 起始索引算出来了,在来看看这么个高度的组件能画多少个项目高度是10的表项,其实也就是   组件高度 / 项目高度 ,因为起始项目有可能向上偏移,为了以防万一   多画一两项也没关系,也就是  组件高度 / 项目高度 + 1 以上就是我的虚表算法,这样不管项目数有多少十万、多少百万(估计没人用那么多...)都只画看到的这几项,大大提高了绘制效率。 例子里的项目数据是用数组来保存,在填充数据的时候会有点慢,这是易语言的问题,绘制都是秒画的,保存数据听说还可以用链表、哈希表...这样填充数据会相当快,不过没试过。 小提示:编译后填充数据速度会灰常快。 列表框我没有美化,只是讲了下算法,想美化的自己折腾去吧,易语言自带的滚动条最大值只能是30000多,所以我拿多功能条做例子。 此帖子只介绍了画法, 响应鼠标消息请关注我的 Ex_DUI随手笔记系列。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值