C++线性表链式存储算法小结

前言:

知道为什么河里钓起来的鱼要比池塘里养的鱼好吃吗?因为鱼塘里的鱼天天有人问,没有天敌追,就等着养肥给人吃,一天到晚邮快邮慢都一样。身上鱼肉不多,油鱼不少,而河里的鱼为了吃饱,为了避免被更大的鱼吃掉它不断的药油,这样生存下来的鱼,那鱼肉吃起来自然有营养,更爽口.五六十年代出生的人,应该也就是我们父母那一辈。当年经济计划制度下,他们的生活被社会安排好了,先科员在科长,后处长在局长,混到哪儿算哪儿,学徒、技工、高级技工教师、中级教师、高级教师。总之,无论在哪个行业,都论资排辈,这样的生活如何让人奋发努力?所以经济发展缓慢,就像我们的线性表的顺序存储结构一样,位置是排好的,一切都得慢慢来。可见,舒适环境是很难培养出坚强品格,被安排好的人生也很难做出伟大的事业.市场经济社会下,机会就太多了,你可以从社会的任何一个位置开始起步,只要你真有决心,没有人可以拦着你。事实也证明,无论出生是什么,之前是凄苦还是富足,都有出人头地的一天。当然,这也就意味着面临的竞争也是空前激烈的,一不小心,你的位置就可能被人插足,甚至你就得out出局。这也多像我们线性表达链式存储结构,任何位置都可以插入和删除

优点和缺点

优点;无需一次性定制列表的容量插入和删除操作,无需移动数据元素。

缺点:数据元素必须保存后,即元素的位置信息获取指定数据的元素,操作需要顺序访问之前的元素

#ifndef _MYLINKLIST_H_
#define _MYLINKLIST_H_
typedef void LinkList;//数据类型的重定义
   

typedef struct_tag_LinkListNode//这个小节点啥也不干,就等着被人包含,这个很重要
{
	struct _tag_LinkListNode* next;
}LinkListNode;//这个是个列表  问题1 老师结点怎样加进去?
//LinkListNode node1; 老师结点和这个有啥关系
LinkList*LinkList_Create();//创建一个列表,返回一个线性表LinkList
void LinkList_Destory(LinkList*list)//销毁列表
void LinkList_Clear(LinkList*list)//清空列表
int LinkList_Length(LinkList*list)//求列表长度
int LinkList_Insert(LinkList*list, LinkListNode*node, int pos);//在列表里面插入一个结点
LinkListNode*LinkList_Get(LinkList*list, int pos)//获取列表中某一个位置的元素
LinkListNode*LinkList_Delete(LinkList*list,int pos)//删除

#endif
#include
#include
#include
#include"linklist.h"
//业务结点都是不断变化的,不可能有一个模板适合所有的业务结点
//在不改变传统业务结点的情况下,可以自由发挥(linux)
typedef  struct Teacher  //现在我有个业务结点叫老师
{
	LinkListNode node;//第一个域  (第一个元素)
	int age;
	char name[64];

}Teacher;
typedef struct _tag_LinkList//创建一个带有投结点的列表
{
	LinkListNodeNode header;//这个是头结点
	int length;//这是长度
}TLinkList;
LinkList*LinkList_Create()
{
	TLinkList*ret = NULL;
	ret = (TLinkList*)malloc(sizeof(TLinkList));
	memset(ret, 0, sizeof(TLinkList));
	ret->length = 0;
	ret->header.next = NULL;
	return ret;
}
void LinkList_Destory(LinkList*list)
{

	if (list != NULL)
	{
		free(list);
		list = NULL;
	}
	return;

}
void main()
{

	printf("hello...
");
	int len = 0, ret = 0;
	int i = 0;
	LinkList*list = NULL;
	Teacher t1, t2, t3, t4,t5;
	t1.age = 31;
	t2.age = 32;
	t3.age = 33;
	t4.age = 34;
	t5.age = 35;
	
	list = LinkList_Create();
	if (list == NULL)
	{
		return;
	}
	len=LinkList_Length(list);
	//链表的算法和具体业务结点分离
	ret = LinkList_Insert(list,( LinkListNode*) (&t1)), 0);//把老师的结点强制转换成LinkListNode  然后把老师的小节点扔进来
	ret = LinkList_Insert(list, (LinkListNode*) (&t2)), 0);//底层库怎样不需要关系,只需要把这些串起来就好了
	ret = LinkList_Insert(list, (LinkListNode*) (&t3)), 0);
	ret = LinkList_Insert(list, (LinkListNode*) (&t4)), 0);
	ret = LinkList_Insert(list, (LinkListNode*) (&t5)),0);
	//遍历
	for (i = 0; i < LinkList_Length(list); i++)
	{
		Teacher*tmp = LinkList_Get(list, i);
		if (tmp == NULL)
		{
			return;
		}
		printf("tmp->age:%d", tmp->age);
	}
	//删除列表
	while (LinkList_Length(list) > 0)
	{
		Teacher*tmp=(Teacher*)LinkList_Delete(list, 0);//删除以后返回0号元素,可以接过来
		if (tmp == NULL)
		{
			return;
		}
		printf("tmp->age:%d", tmp->age);//然后在打印出来
	}
	// 下面这三个就是核心业务了   指针指向谁, 就把谁的地址付给指针
		//分清楚链表的操作逻辑和辅助指针变量之间的关系
		int LinkList_Insert(LinkList*list, LinkListNode*node, int pos);//在列表里面插入一个结点
	{
		int ret = 0;
		LinkListNode*current = NULL;//current这个是辅助指针,自定义的,你也可以叫别的
		TLinkList*tList = NULL;
		if (list == NULL || node == NULL || pos < 0)
		{
			ret = 0;
			printf("func LinkList_Insert() err:%d
", ret);
			return ret;
		}
		tList = (TLinkList*)list;
		current = &(tList->header);//他的功能就是让列表往后跳
		for (i = 0; i < pos && (current - next;
		}
		node->next = current->next;//让新节点和前后的列表连接
		current->next = node;//node 头结点  说明把第一个串起来了  current 现在还指向头部
		tList->length++;//通过头插法继续
		return 0;
	}
	LinkListNode*LinkList_Get(LinkList*list, int pos)//获取列表中某一个位置的元素
	{
		int ret = 0;
		LinkListNode*current = NULL;//current这个是辅助指针,自定义的,你也可以叫别的
		TLinkList*tList = NULL;
		if (list == NULL || pos < 0)
		{
			ret = 0;
			printf("func LinkList_Insert() err:%d
", ret);
			return NULL;
		}
		tList = (TLinkList*)list;
		current = &(tList->header);//让辅助指针变量指向链表的头部
		for (i = 0; i < pos; i++)//跳pos次
		{
			current = current->next;
		}
		node->next = current->next;
		current->next = node;
		return current->next;

	}
	LinkListNode*LinkList_Delete(LinkList*list, int pos)//删除
	{
		int i = 0;
		int ret = 0;
		LinkListNode*current = NULL;//引入2个复制指针变量
		LinkListNode*ret = NULL;//定义了ret 来缓冲删除的结点
		TLinkList*tList = NULL;
		if (list == NULL || pos < 0)
		{
			ret = 0;
			printf("func LinkList_Insert() err:%d
", ret);
			return NULL;
		}
		tList = (TLinkList*)list;
		current = &(tList->header);//让辅助指针变量指向链表的头部
		for (i = 0; i < pos; i++)//跳pos次
		{
			current = current->next;
		}
		//缓冲被删除的结点位置  让前一个指向后一个,连起来
		ret = current->next;
		//连线 假如我们把3号位置删点了,现在3号位置就空缺了,之前是4号位置就是现在的3号位置了,所以要连起来啊,指向后面的
		current->ret->next;
		tList->length--;
		return ret;
	}

你学废了吗[灵光一闪]

展开阅读全文

页面更新:2024-02-22

标签:链式   结点   鱼肉   河里   节点   小结   指针   变量   头部   算法   元素   位置   老师   关系   操作   业务   列表   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top