1.单链表
单链表的结点类型node定义:

typedef struct linknode
{
int data;
struct linknode *node;
}node;

<1>.建立单链表

void CreateSingleLink()
{
node *head, *p, *s;
int tempValue;
bool bCycle = true; //bCycle循环控制变量 head = (node *)malloc(sizeof(node)); //建立头结点
p = head; while (bCycle)
{
scanf("%d", &tempValue);
if ( != tempValue) //以0标志结束
{
s = (node *)malloc(sizeof(node)); //建立下一个结点
s->data = tempValue;
p->next = s; //把新结点连接到前面建立的链表中
p = s;
}
else
{
bCycle = false;
} } p->next = NULL; //如果是循环链表,则改为p->next = head;
p = head;
head = head->next;
free(p); //删除头结点
}

<2>.单链表查找结点

bool FindNode(node *head, int iValue)
{
bool bFind = false;
node *p;
//if 普通链表
p = head;
//else 循环列表
//if (head->data == iValue)
//{
// bFind = true;
// return bFind;
//}
//p = head->next; while (p!=NULL && p->data!=iValue)
{
p = p->next;
} if (p != NULL)
{
bFind = true;
} return bFind;
}

<3>.单链表长度
//普通链表

int LengthLink(node *head)
{
int iLength = ;
node *p;
p = head; while (p != NULL)
{
p = p->next;
iLength++;
} return iLength;
}

//循环链接

int LengthLink(node *head)
{
int iLength = ;
node *p; if (head == NULL) //空链表
{
return iLength;
} p = head->next;
iLength = ;
while (p != NULL)
{
p = p->next;
iLength++;
} return iLength;
}

<4>.单链表插入结点

bool InsertNode(node *head, int i, int iValue)
{
node *s, *p;
int j;
bool bInsert = false; s = (node *)malloc(sizeof(node)); //建立待插入结点
s->data = iValue; if (i == )
{
//表头插入结点
s->next = head;
head = s;
bInsert = true;
return bInsert;
} p = head;
j = ;
while (p!=NULL && j<i)
{
j++;
p = p->next;
} if (p != NULL)
{
//查找成功,将s插入到其后
s->next = p->next;
p->next = s;
bInsert = true;
} return bInsert;
}

<5>.单列表删除结点

bool DeleteNode(node *head, int iValue)
{
node *p, *q;
bool bDelete = false; if (head == NULL)
{
//链表为空,下溢处理
return bDelete;
} if (head->data == iValue)
{
//表头为删除结点
p =head;
head = head->next;
free(p);
bDelete = true;
return bDelete;
} q = head;
p = head->next; //从第二个结点开始查找值为iValue的结点
while (p!=NULL && p->data!=iValue)
{
if (p->data != iValue)
{
q = p;
p = p->next;
}
} if (p != NULL)
{
//找到结点,作删除处理
q->next = p->next;
free(p);
bDelete = true;
} return bDelete;
}

2.双链表
双链表结点类型定义

typedef struct linknode
{
int data;
struct linknode *left, *right;
}dnode;

<1>.创建双链表

void CreateDoubleLink()
{
dnode *head, *p, *s;
int iValue;
bool bCycle = true; //bCycle控制循环变量 head = (dnode *)malloc(sizeof(dnode));
p = head;
while (bCycle)
{
scanf("%d", &iValue);
if (iValue != ) //0作为标志结束
{
s = (dnode *)malloc(sizeof(dnode)); //建立下一个结点
s->data = iValue;
p->right = s;
s->left = p;
p = s;
}
else
{
bCycle = false;
}
} head = head->right; //删除头结点
head->left = NULL; //如果是循环双链表,则head->left = p;
p->right = NULL; //如果是循环双链表,则p->right = head;
}

<2>.查找结点
//普通双链表

bool FindNode(dnode *head, int iValue)
{
bool bFind = false;
dnode *p;
p = head; while (p!=NULL && p->data!=iValue)
{
p = p->right;
} if (p != NULL)
{
bFind = true;//找到结点
} return bFind;
}

//循环双链表

bool FindNode(dnode *head, int iValue)
{
bool bFind = false; if (head->data == iValue)
{
bFind = true;
return bFind;
} dnode *p;
p = head->right;
while (p->data!=iValue && p!=head)
{
p = p->right;
} if (p != head)
{
bFind = true; //找到结点
} return bFind;
}

<3>.双链表插入结点

bool InsertNode(dnode *head, int i, int iValue)
{
dnode *p, *s;
bool bInsert = false; s = (dnode *)malloc(sizeof(dnode)); //创建待插入结点;
s->data = iValue; if (i == )
{
//表头插入结点
s->right = head;
head->left = s;
head = s;
head->left = NULL;
bInsert = true;
return bInsert;
} int j = ;
p = head;
while (p!=NULL && j<i)
{
j++;
p = p->right;
} if (p != NULL)
{
//查找成功,把s插到p之后
if (p->right == NULL) //p为最后一个结点
{
p->right = s;
s->right = NULL;
s->left = p;
}
else
{
s->right = p->right;
p->right->left = s;
p->right = s;
s->left = p;
}
bInsert = true;
} return bInsert;
}

<4>.双链表删除结点

bool DeleteNode(dnode *head, int iValue)
{
bool bDelete = false; if (head == NULL)
{
//链表为空,下溢处理
return bDelete;
} dnode *p;
if (head->data == iValue) //表头为删除结点
{
p = head;
head = head->right;
head->left = NULL;
free(p);
bDelete = true;
return bDelete;
} p = head->right;
while (p!=NULL && p->data!=iValue)
{
if (p->data != iValue)
{
p = p->right;
}
} if (p != NULL)
{
if (p->right = NULL) //最后一个结点
{
p->left->right = NULL;
free(p);
}
else
{
p->left->right = p->right;
p->right->left = p->left;
free(p);
}
bDelete = true;
} return bDelete;
}

C/C++ 知识点---链表操作的更多相关文章

  1. c语言实现--带头结点单链表操作

    可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址 ...

  2. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  3. 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏

    数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...

  4. YTU 2620: B 链表操作

    2620: B 链表操作 时间限制: 1 Sec  内存限制: 128 MB 提交: 418  解决: 261 题目描述 (1)编写一个函数createlink,用来建立一个动态链表(链表中的节点个数 ...

  5. C# 链表操作

    关于链表操作,在C#当中微软已经提供了一个LinkedList<T>的数据结构,通过这个类提供的一系列方法就能够实现链表操作. 这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实 ...

  6. C语言,单链表操作(增删改查)(version 0.1)

    这天要面试,提前把链表操作重新写了一遍.备份一下,以备不时之需. 希望有人能看到这篇代码,并指正. // File Name : list.h #include "stdafx.h" ...

  7. C语言链表操作模板(添加,删除,遍历,排序)

    C语言链表操作模板,摘自郝斌的C语言视频教程,简单的修改成了纯C格式.当年照着视频学习的时候记录下来的,在使用的时候直接拿来修改修改修改能节约不少时间的. /********************* ...

  8. ZT C语言链表操作(新增单向链表的逆序建立)

    这个不好懂,不如看 转贴:C语言链表基本操作http://www.cnblogs.com/jeanschen/p/3542668.html ZT 链表逆序http://www.cnblogs.com/ ...

  9. C#的链表操作[数据结构-线性表]

    链式存储结构图解: 上图中,a1,是数据,紧跟着后面的d1是下一个节点的地址值.也就是一个节点的最后存储的是下一个节点的地址值,最后一个节点的存储的下一个地址值是null,代表链表结束. 1,定义链表 ...

随机推荐

  1. ajax提交到后台是中文乱码

    运行程序时遇到用ajax的url中传递数据,后台用request.getParamet()时出现中文乱码 $.ajax({ type: "POST", url: g_sBasePa ...

  2. mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)

    下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...

  3. Java异常体系简析

    最近在阅读<Java编程思想>的时候看到了书中对异常的描述,结合自己阅读源码经历,谈谈自己对异常的理解.首先记住下面两句话: 除非你能解决这个异常,否则不要捕获它,如果打算记录错误消息,那 ...

  4. JavaWeb 后端 <十三> 之 监听器 JSTL国际化

    1. 监听器 1.1   概述 监听器: 主要是用来监听特定对象的创建或销毁.属性的变化的! 是一个实现特定接口的普通java类! 对象: 自己创建自己用 (不用监听) 别人创建自己用 (需要监听) ...

  5. Html5元素布局

    本教程十分简单,适合新手(因为我也是新手).本教程参考了"菜鸟教程". 笔者希望做到元素相对于浏览器的角落布局,即九个典型位置: 这个理念其实和UE4中的UMG锚定一样.Html5 ...

  6. java 图片质量压缩

    /** * 图片质量压缩 * @param file 要压缩的图片文件 * @param input 文件输入流 * @param quality 压缩质量(0-1) * @author ouyang ...

  7. Centos 6.5开启rsync同步

    一.测试环境 操作系统:Centos6.5 Server1:172.18.11.100       源服务器 Server2:172.18.11.110       目标服务器 二.操作步骤: 1.先 ...

  8. jvm学习002 虚拟机类加载过程以及主动引用和被动引用

    虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为 ...

  9. 利用TinyXml进行数据库的热更新

    TinyXml库比较小,但功能较为完善,挺适合用来读取小块的xml文件; 我写了几个利用TinyXml读取和保存数据的例子,大家可以参考使用; 主要是为了热更新配置所做的一些函数应用; //开始热更 ...

  10. 【转载】 ISO14229系列之一:简介

    转载链接:http://www.cnblogs.com/autogeek/p/4458591.html 前言 由于工作中经常用到ISO-14229,因此决定对该协议做个总体介绍和总结,既是对自己学习的 ...