博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单向链表实现
阅读量:7106 次
发布时间:2019-06-28

本文共 2413 字,大约阅读时间需要 8 分钟。

单向链表

单链表有一个头节点head,指向链表在内存的首地址。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员(实际需要保存的数据)和指向下一个结构体类型节点的指针即下一个节点的地址(事实上,此单链表是用于存放整型数据的动态数组)。链表按此结构对各节点的访问需从链表的头找起,后续节点的地址由当前节点给出。无论在表中访问那一个节点,都需要从链表的头开始,顺序向后查找。链表的尾节点由于无后续节点,其指针域为空,写作为NULL。

<a href="http://www.emacsvi.com/wp-content/uploads/2015/10/linkedlist.bmp"><img src="http://www.emacsvi.com/wp-content/uploads/2015/10/linkedlist.bmp" alt="linkedlist" width="600" height="130" class="alignnone size-full wp-image-274" /></a>

<pre lang="c" escaped="true">

/* linkedlist.h */

#ifndef LINKEDLIST_H
#define LINKEDLIST_H

typedef struct node *link;

struct node
{
unsigned char elem;
link next;
};

link make_node(unsigned char elem);

void free_node(link p);
link search(unsigned char elem);
void insert(link p);
void delete(link p);
void traverse(void (*visit)(link));
void destroy(void);
void push(link p);
link pop(void);

#endif

</pre>

<pre lang="c" escaped="true">

#include <stdlib.h>

#include "linkedlist.h"

static link head=NULL;

link make_node(unsigned char elem)

{
link p = malloc(sizeof(*p));
p->elem = elem;
p->next = NULL;
return p;
}

void free_node(link p)

{
free(p);
}

link search(unsigned char elem)

{
link p;
for (p = head; p; p = p->next)
if (elem == p->elem)
return p;
return NULL;
}

void insert(link p)

{
p->next = head;
head = p;
}

void delete(link p)

{
link pre;
if (head == p)
{
head = p->next;
return;
}
for (pre = head; pre; pre = pre->next)
if (pre->next == p)
{
pre->next = p->next;
return;
}
}

/* 没有看太明白

void delete(link p)
{
link *pnext;
for (pnext = &head; *pnext; pnext = &(*pnext)->next)
if (*pnext == p)
{
*pnext = p->next;
return;
}
}
*/

void traverse(void (*visit)(link))

{
link p;
for (p = head; p; p = p->next)
visit(p);
}

void destroy(void)

{
link q, p=head;
head = NULL;
while (p)
{
q = p;
p = p->next;
free_node(q);
}
}

void push(link p)

{
insert(p);
}

link pop(void)

{
if (NULL == head)
return NULL;
else
{
link p = head;
head = head->next;
return p;
}
}

</pre>

<pre lang="c" escaped="true">

#include <stdio.h>

#include "linkedlist.h"

void print_elem(link p)

{
printf("%d\n", p->elem);
}

int main(void)

{
link p;

insert(make_node(10));

insert(make_node(5));
insert(make_node(90));
p = search(5);
delete(p);
free_node(p);
traverse(print_elem);
destroy();
push(make_node(100));
push(make_node(200));
push(make_node(250));
while (p = pop())
{
print_elem(p);
free_node(p);
}

return 0;

}

</pre>

 

转载于:https://www.cnblogs.com/liweilijie/p/4984181.html

你可能感兴趣的文章
软件工程概论个人作业04(最大子数组)
查看>>
企业级 SpringBoot 教程 (二十)处理表单提交
查看>>
opencv +python 提取roi目标区域全部像素的值 得出上下限 均匀值
查看>>
Hbase
查看>>
Lua,github,nginx
查看>>
英文论文润色的问题
查看>>
java实现二维码生成及调用打印机打印
查看>>
oracle多行合并一行,且需排序
查看>>
【java IO File】统计项目代码总共多少行
查看>>
vmware12中安装MAC OS X 10.10
查看>>
placeholder样式
查看>>
读书笔记之_Win10 与Jmeter5.1.1界面兼容:
查看>>
suse10安装oracle11g出现的问题解决
查看>>
js与php传递参数
查看>>
[转]DPM2012系列之六:在Win7上安装DPM远程管理控制台
查看>>
MSSQL清理日志
查看>>
Class hierarchy of UIResponder as well as subclasses of UIView and UIControl
查看>>
IntelliJ IDEA + Maven环境编写第一个hadoop程序
查看>>
OpenGL应用函数库介绍
查看>>
常量、枚举
查看>>