链表是一种常用的数据结构,每个节点通过链或者指针链接在一起,程序通过间接指针访问链表中的节点。

typedef struct Node  {
//指向下一个节点的指针
struct Node *next;
int value;
}

单链表只可以单向遍历

单链表中插入:第一版

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0 typedef struct Node {
struct Node *next;
int value;
} LinkList; //假设链表从小到大排序
int linkInsert(LinkList * current, int value)
{
//保存前一个节点
LinkList *previous;
LinkList *new; //循环到合适的位置
while (current-> value < value) {
previous = current;
current = current->next;
} new = malloc(sizeof(LinkList));
if (new == NULL) {
return FALSE;
} new->value = value;
new->next = current;
previous->next = new; return TRUE;
}

当插入值到表头和表尾时,会出错,需要加上对特殊情况的判断,将传入的第一个参数由,指向链表头部节点的指针改为,指向 指向链表头部的指针的指针,这样就可以添加节点到链表的头部。

添加特殊情况处理的版本二:

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0 typedef struct Node {
struct Node *next;
int value;
} LinkList; //
int linkInsert(LinkList **rootPtr, int value)
{
//保存前一个节点
LinkList *previous;
LinkList *current;
LinkList *new; current = *rootPtr;
previous = NULL; //循环到达末尾和找到符合要求的节点
while (current != NULL && current-> value < value) {
previous = current;
current = current->next;
} new = malloc(sizeof(LinkList));
if (new == NULL) {
return FALSE;
} new->value = value;
new->next = current; //指向列表首页
if(previous == NULL){
*rootPtr = new;
}else{
previous -> next = new;
} return TRUE;
} int main()
{
LinkList third = {NULL, 4};
LinkList second = {&third, 2};
LinkList first = {&second, 1};
LinkList *head = &first;
LinkList **rootPtr = &head; linkInsert(rootPtr, 0); LinkList *pre = NULL;
LinkList *current = *rootPtr;
while(current != NULL){
printf("%d\t", current -> value);
pre = current;
current = current -> next;
} return 0;
}

优化:

版本二把一个节点插入到链表的起始位置当做一种特殊情况处理,对于新节点需要修改的是根节点,对于其他任何点,修改的是前一个节点的next字段,其实这个两个修改是相同的,即修改指向当前节点的指针,所以当我们移动到下一个节点时,需要保存的是指向下一个节点的next字段的指针,而不是保持指向下一个节点的指针

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0 typedef struct Node {
struct Node *next;
int value;
} LinkList; //
int linkInsert(LinkList **nextPtr, int value)
{
LinkList *current;
LinkList *new; //nextPtr为指向当前节点的next字段的指针
while ((current = *nextPtr) != NULL && value > current -> value) {
nextPtr = &current -> next;
} new = malloc(sizeof(LinkList));
if (new == NULL) {
return FALSE;
} new-> value = value;
new-> next = current;
//前一个节点指向最新的节点,即使是表头也可以正常处理
*nextPtr = new; return TRUE;
} int main()
{
LinkList third = {NULL, 4};
LinkList second = {&third, 2};
LinkList first = {&second, 1};
  //把head当做next字段,指向第一个节点
LinkList *head = &first;
LinkList **nextPtr = &head; linkInsert(nextPtr, 3); LinkList *current = *nextPtr;
while(current != NULL){
printf("%d\t", current -> value);
current = current -> next;
} return 0;
}

  

  

C和指针 第十二章 使用结构和指针的更多相关文章

  1. C和指针 第十二章 使用结构和指针 双链表和语句提炼

    双链表中每个节点包含指向当前和之后节点的指针,插入节点到双链表中需要考虑四种情况: 1.插入到链表头部 2.插入到链表尾部 3.插入到空链表中 4.插入到链表内部 #include <stdio ...

  2. C和指针 第十二章 结构体 习题

    12.3 重新编写12.7,使用头和尾指针分别以一个单独的指针传递给函数,而不是作为一个节点的一部分 #include <stdio.h> #include <stdlib.h> ...

  3. C和指针 第十二章 结构体 整体赋值 error: expected expression

    定义结构体后整体赋值时发生错误 typedef struct NODE { struct NODE *fwd; struct NODE *bwd; int value; } Node; //声明变量 ...

  4. 《Linux命令行与shell脚本编程大全》第十二章 使用结构化命令

    许多程序要就对shell脚本中的命令施加一些逻辑控制流程. 结构化命令允许你改变程序执行的顺序.不一定是依次进行的 12.1 使用if-then语句 如下格式: if command then     ...

  5. C和指针 (pointers on C)——第十二章:利用结构和指针

    第十二章 利用结构和指针 这章就是链表.先单链表,后双向链表. 总结: 单链表是一种使用指针来存储值的数据结构.链表中的每一个节点包括一个字段,用于指向链表的下一个节点. 有一个独立的根指针指向链表的 ...

  6. perl5 第十二章 Perl5中的引用/指针

    第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用  子程序模板七.数组与子程序八.文件句 ...

  7. [CSAPP笔记][第十二章并发编程]

    第十二章 并发编程 如果逻辑控制流在时间上是重叠,那么它们就是并发的(concurrent).这种常见的现象称为并发(concurrency). 硬件异常处理程序,进程和Unix信号处理程序都是大家熟 ...

  8. C primer plus 第五版十二章习题

    看完C prime plus(第五版)第十二章,随带完成了后面的习题. 1.不使用全局变量,重写程序清单12.4的程序. 先贴出12.4的程序,方便对照: /* global.c --- 使用外部变量 ...

  9. 《OpenCL异构并行编程实战》补充笔记散点,第五至十二章

    ▶ 第五章,OpenCL 的并发与执行模型 ● 内存对象与上下文相关而不是与设备相关.设备在不同设备之间的移动如下,如果 kernel 在第二个设备上运行,那么在第一个设备上产生的任何数据结果在第二个 ...

随机推荐

  1. hdu-5992 Finding Hotels(kd-tree)

    题目链接: Finding Hotels Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 102400/102400 K (Java/ ...

  2. 一个页面从输入URL到页面加载显示完成,这个过程都发生了什么?

    对于网址栏的URL不同的操作方式有不同的加载资源.获取数据的方式,下面的详细过程针对"在地址栏输入URL,按enter(回车)键加载资源"此种操作方式做解析,其它的方式的过程大同小 ...

  3. IIS HTTP 错误 404.17 - Not Found HTTP 错误 404.2 解决方法

    出现这种情况的原因通常是因为先安装了Framework,后安装的IIS: 解决方法 运行cmd,输入: C:\Windows\Microsoft.NET\Framework\V4.0.30319\as ...

  4. 20145215&20145307信息安全系统设计基础实验报告

    20145215&20145307信息安全系统设计基础实验报告 PART1 一.实验原理 交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码.同一个体系结构可以运行不同的操作系统 ...

  5. win7/8 访问 访问局域网 默认加载域 而无法成功访问的问题

    运行 gpedit.msc选择 本地计算机策略- 计算机配置-windows设置-安全设置-本地策略-安全选项 其中有个 网络安全:lan管理员身份验证级别 选择 发送LM和NTLM响应

  6. Codeforces Round #381(div 2)

    A.(分类讨论) 题意:你有n本书,有三种买书方案,花a元买1本,花b元买2本,花c元买3本,问最少花多少钱,使得你书的总数是4的倍数 分析:分类讨论的题,但是要注意你可以买超过4本书--可以买5本. ...

  7. php根据地址的经纬度查询周围的城市例子

    目前的工作是需要对用户的一些数据进行分析,每个用户都有若干条记录,每条记录中有用户的一个位置,是用经度和纬度表示的.还有一个给定的数据库,存储的是一些已知地点以及他们的经纬度,内有43W多条的数据.现 ...

  8. 美化radio和checkbox样式

    HTML部分 <div id="holder"> <div> <div class="tag">Checkbox Small ...

  9. ssh项目将搜索条件进行联动

    <s:form namespace="/tb" action="tenderList" name="searchForm" id=&q ...

  10. BZOJ 2120: 数颜色

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 3623  Solved: 1396[Submit][Status][Discuss] ...