前言:
知道为什么河里钓起来的鱼要比池塘里养的鱼好吃吗?因为鱼塘里的鱼天天有人问,没有天敌追,就等着养肥给人吃,一天到晚邮快邮慢都一样。身上鱼肉不多,油鱼不少,而河里的鱼为了吃饱,为了避免被更大的鱼吃掉它不断的药油,这样生存下来的鱼,那鱼肉吃起来自然有营养,更爽口.五六十年代出生的人,应该也就是我们父母那一辈。当年经济计划制度下,他们的生活被社会安排好了,先科员在科长,后处长在局长,混到哪儿算哪儿,学徒、技工、高级技工教师、中级教师、高级教师。总之,无论在哪个行业,都论资排辈,这样的生活如何让人奋发努力?所以经济发展缓慢,就像我们的线性表的顺序存储结构一样,位置是排好的,一切都得慢慢来。可见,舒适环境是很难培养出坚强品格,被安排好的人生也很难做出伟大的事业.市场经济社会下,机会就太多了,你可以从社会的任何一个位置开始起步,只要你真有决心,没有人可以拦着你。事实也证明,无论出生是什么,之前是凄苦还是富足,都有出人头地的一天。当然,这也就意味着面临的竞争也是空前激烈的,一不小心,你的位置就可能被人插足,甚至你就得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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号