怎么做盲盒,wordpress路径优化,ppt素材免费网站,html网站地图在线生成————————————本文旨在交流学习计算机知识#xff0c;欢迎交流讨——————————— 上一章#xff0c;我们浅显的讨论了链表的结构#xff0c;本文在上一章的链表的基础上做出了些许优化#xff0c;可配合食用。 回到正题#xff0c;我们已经了解链表的结…————————————本文旨在交流学习计算机知识欢迎交流讨——————————— 上一章我们浅显的讨论了链表的结构本文在上一章的链表的基础上做出了些许优化可配合食用。 回到正题我们已经了解链表的结构它是一种非连续空间存储的线性表主要依靠地址域访问下一个元素并通过遍历操作进行增删改查。
如图这是我们上一章所介绍的链表结构
我们的惯用操作
//单向链表的插入删除先找到节点p//插入
newnode-nextp-next;
p-nextnewnode;
//删除
node_new temp;
tempp-next;
p-nextp-next-next;
free(temp);看着这幅图我们不禁想到一个问题我们真的需要这个头节点吗是否有些看起来不整齐且结构不一致于是我们考虑到也许我们可以用指针标记header的位置然后再在每一次的函数接口里面新建一个头结点用完即删这样或许看起来更加的整齐和高效。
如图所示 这时我们引入dummy节点并将其放入栈dummy节点充当第一个节点。
void insert(link*header,element val)
{node_t dummy;dummy-nextheader;//header为我们的指针因为简化了头结点我们只传入指针node_t *pdummy;//p为遍历指针从dummy开始遍历while(p-next){pp-next;}headerdummy-next;//还原操作
}下面我们重写一下代码
定义链表结构
typedef int Element_t;
struct node{Element_t val;struct node *next;
}node_t;
//节点的结构体typedef struct {node_t *header;int count;
} List_t;
//链表结构体包括头结点和数量 初始化链表
void initList(List_t *table)
{table-count0;table-headerNULL;
)
从最基础的展现函数开始
void shouList(const List_t *table){node_t ptable-header;printf(List :);while(p){printf(%d\t,p-val);pp-next;}printf(\n);
}
这里如果不知道const为什么要放在形参里的可以看看我的第一篇文章里面有详细解答。
然后就是增删改查的经典案例了 从增开始 int insertListHeader(List_t* table,Element_t val)
{
node_t dummy;
dummy.nexttable-header;node_t *pdummy;//临时头结点dummy及临时过渡中间容器pnode_t *new_nodemalloc(sizeof(node_t));if(new_nodeNULL){printf(ERROR\n);)
//朴素的增加操作new_node-valval;new_node-nextp-next;p-nextnew_node;table-count;table-headerdummy-next;
return 0;
} 然后这是按位插入操作
int insertListPos(List_t* table,int pos,Element_t val)
{if(pos0||postable-count){printf(the pos is not a truly place\n);}node_t dummy;dummy.nexttable-header;node_t* pdummy;int index-1;//计数器while(indexpos-1){pp-next;index;}//遍历查找node_t *new_nodemalloc(sizeof(node_t));new_node-nextp-next;p-nextnew_node;table-count;table-headerdummy.next;return 0;
} 删除操作
int deleteList(List_t* table,Element val)
{node_t dummy;dummy.nexttable-header;node_t* pdummy;while(p-nextp-val!val){pp-next;}if(p-nextNULL){printf(404 NOT FOUND\n);return 0;}node_t tempmalloc(sizeof(node_t));tempp-next;p-nexttemp-next;free(temp);--table-count;table-headerdummy-next;return 0;
}
最后的最后就是销毁链表了
###关于销毁链表其原理就是按位遍历并按位删除。###
void destroyList(List_t *table) {node_t dummy;dummy.next table-header;node_t *p dummy;node_t *temp;while (p-next) {temp p-next;p-next temp-next;free(temp);--table-count;}printf(LinkList have %d node!\n, table-count);// table-header NULL;
}
最后是测试函数对比 // 带头指针的单向链表测试
int test02() {List_t stu1;initChainList(stu1);for (int i 0; i 10; i) {insertListHeader(stu1, i 100);}showList(stu1);insertListPos(stu1, 2, 220);showList(stu1);deleteListElement(stu1, 104);showList(stu1);destroyList(stu1);return 0;
}int main() {test02();return 0;
}
以上就是附录内容欢迎指正