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 (0 != 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 = 0;node *p;p = head;while (p != NULL){p = p->next;iLength++;}return iLength;
}

//循环链接

int LengthLink(node *head)
{int iLength = 0;node *p;if (head == NULL) //空链表
    {return iLength;}p = head->next;iLength = 1;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 == 0){//表头插入结点s->next = head;head = s;bInsert = true;return bInsert;}p = head;j = 1;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) //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 == 0){//表头插入结点s->right = head;head->left = s;head = s;head->left = NULL;bInsert = true;return bInsert;}int j = 1;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;
}

转载于:https://www.cnblogs.com/sz-leez/p/4607721.html

C/C++ 知识点---链表操作相关推荐

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

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

  2. 算法之递归(3)- 链表操作

    算法之递归(3)- 链表操作 递归(2)尝试了一个单链表的遍历,同时又分析了如何添加自己的操作,是在递归调用之前,还是在递归调用之后. 今天,打算将问题深入一下,即添加相应的操作在递归的过程中. (免 ...

  3. Java数据结构 利用双栈实现链表操作

    利用双栈实现链表操作 class CQueue {private int count;private ListNode head;private ListNode tail;public CQueue ...

  4. 【Linux 内核 内存管理】RCU 机制 ④ ( RCU 模式下更新链表项 list_replace_rcu 函数 | 链表操作时使用 smp_wmb() 函数保证代码执行顺序 )

    文章目录 一.RCU 模式下更新链表项 list_replace_rcu 函数 二.链表操作时使用 smp_wmb() 函数保证代码执行顺序 一.RCU 模式下更新链表项 list_replace_r ...

  5. Java单向链表操作详解

    /* 先定义一个Node类用来存储节点的值域和指针域 * 即当前节点中的值和后面节点的方法 * 在C中就是相当与定义一个结构体类型一个数据域和指针域的方法 */ class LNode{//这个写法已 ...

  6. 【数据结构-线性表】顺序表和链表(几种链表操作技巧+几种链表形式)

    链表的操作 链表中的插入(头插) void *insertNode(ListNode *head, ListNode *node) {node->next = head;head = node; ...

  7. 链表操作---面向过程--到---面型对象---到模板类

    设计一个链表操作,从分设计到实现分别从3个step进行  (1)面向过程的程序设计---结构体+函数 /* 链表操作-----step1-----用结构体实现链表操作链表设计----需求分析 1.创建 ...

  8. 82. 删除排序链表中的重复元素 II(链表操作)

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4->5 输出: 1-&g ...

  9. Pandas知识点-添加操作append

    Pandas知识点-添加操作append 在Pandas中,append()方法用于将一个或多个DataFrame或Series添加到DataFrame中.append()方法也可以用于合并操作,本文 ...

  10. Pandas知识点-合并操作combine

    Pandas知识点-合并操作combine combine是联合的意思,在Pandas中,combine()方法也是一种实现合并的方法,本文介绍combine()方法的用法. 一.combine_fi ...

最新文章

  1. C++中getline()的用法
  2. build怎么调试 react_webpack打包调试react并使用babel编译jsx配置方法
  3. python xlrd关闭_Python在工作中的应用
  4. Java多线程(四)之ConcurrentSkipListMap深入分析
  5. 从 3.1 到 5.0 —— OpenReservation 更新记
  6. 【运动学】基于matlab速度+加速度数值计算(匀速圆周运动) 【含Matlab源码 975期】
  7. react-native系列(11)组件篇:Image图片加载和ImageEditor图片剪切
  8. 爱企查爬虫selenium
  9. 2020年测试面试经历以及面试题大全
  10. Linux自建RustDesk中继服务器
  11. ipad打开网页无法播放视频
  12. Android APP 卡顿问题分析及解决方案
  13. R语言——(六)、线性回归模型
  14. 读懂 Android 中的代码混淆
  15. 任意多边形的面积(C语言)
  16. java基础入门传智播客电子版,手撕面试官
  17. 基于 Prometheus 的边缘计算监控实践
  18. Apache Hive入门:模拟实现Hive功能、Hive架构、 组件
  19. 美国访问学者签证的资金证明如何开?
  20. RAID的使用-双倍提升、双倍快乐

热门文章

  1. FIFO、LRU、LFU的含义和原理(转)
  2. [LeetCode]Linked List Cycle
  3. Thinkphp twig
  4. oracle存储过程(PL/SQL)
  5. Centos7升级gcc版本方法之一使用scl软件集
  6. Java并发面试,幸亏有点道行,不然又被忽悠了 1
  7. oracle 导入DMP数据 imp 10g
  8. 同步、异步、堵塞、非堵塞概念总结
  9. Shell多线程编程的实例
  10. React中函数式声明组件