C语言实现双向非循环链表(带头结点尾结点)的节点插入

对于双向链表,个人推荐使用带头结点尾结点的方式来处理会比较方便。我在《C语言实现双向非循环链表(不带头结点)的节点插入》中详细实现了在不带头结点的情况下的插入。这次我们将会来在使用头结点尾结点的情况下在任意的位置插入元素。代码上传至 https://github.com/chenyufeng1991/InsertNodeDoubleLinkedList_HeadNode 。

核心代码如下:

//插入一个节点
//插入位置分别为0,1,2,.....
int InsertNodeList(Node *pHead,Node *pTail,int pos,int x){

    int i = 0;
    Node *pMove;
    Node *pInsert;
    pInsert = (Node *)malloc(sizeof(Node));
    memset(pInsert, 0, sizeof(Node));
    pInsert->prior = NULL;
    pInsert->next = NULL;
    pInsert->element = x;

    pMove = pHead;
    while (pMove != pTail) {
        if (i == pos) {
            //注意这里的链接顺序
            pMove->next->prior = pInsert;
            pInsert->next = pMove->next;
            pMove->next = pInsert;
            pInsert->prior = pMove;

            printf("%s函数执行,在pos=%d位置插入x=%d节点成功\n",__FUNCTION__,pos,x);
            return 1;
        }
        i++;
        pMove = pMove->next;
    }

    printf("%s函数执行,插入元素失败\n",__FUNCTION__);

    return 0;
}
时间: 2024-10-14 11:18:50

C语言实现双向非循环链表(带头结点尾结点)的节点插入的相关文章

C语言实现双向非循环链表的逆序打印

我在上一篇博客中<C语言实现双向非循环链表>实现了如何构造一个双向非循环链表,并实现了正向打印.我还在之前一篇博客<C语言实现单链表的逆序打印>中实现了单链表的逆序打印.这篇博客我们来实现对双向非循环链表进行逆序打印,实现起来非常的简单.代码已经上传至 https://github.com/chenyufeng1991/ReverseDoubleLinkedList . 核心代码如下: //打印非循环双向链表,这个其实是正向打印 void printList(Node *pNode

C语言实现双向非循环链表的节点插入

我在之前一篇博客中<C语言实现双向非循环链表的逆序打印>讲到了如何逆序输出一个双向非循环链表,让我们对这种链表类型有了理性的认识.今天我们要来实现的是对双向非循环链表进行节点的插入.大家可以和<C语言实现单链表节点的插入>单链表的节点插入对比着学习.代码上传至  https://github.com/chenyufeng1991/InsertDoubleLinkedList . 核心代码如下: Node *InsertList(Node *pNode,int pos,int x){

C语言实现双向非循环链表的清空

我在之前一篇博客<C语言实现单链表的基本操作>实现了如何清空一个单链表,现在换成了双向的非循环链表,整体思路是一样的.代码上传至:https://github.com/chenyufeng1991/ClearDoubleLinkedList  . 核心代码如下: Node *ClearDoubleLinkedList(Node *pNode){ if (pNode == NULL) { printf("%s函数执行,原链表就是空链表,无须执行该方法\n",__FUNCTIO

C语言实现非循环双链表节点的删除(带头结点尾结点)

我在之前一篇博客<C语言实现非循环双链表节点的删除(不带头结点)>中详细讲解了不含头尾节点的双链表中删除一个节点,处理过程还是稍显麻烦.自从我们学习使用头尾节点来处理双链表后,删除过程就非常方便.代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleLinkedList_HeadList . 核心代码如下: //删除pos位置的节点 int DeletePosList(Node *pHead,Node *pTail,int pos){

C语言通用双向循环链表操作函数集

说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现.链表由一系列存储结点组成,结点可在运行时动态生成.每个结点均由两部分组成,即存储数据元素的数据域和存储相邻结点地址的指针域.当进行插入或删除操作时,链表只需修改相关结点的指针域即可,因此相比线性

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客<C语言实现单链表(不带头结点)的基本操作>中具体实现了不带头结点的单链表的11种操作:如计算链表长度.初始化.创建链表.清空链表等等.但是在实际使用中,带头结点的单链表往往比不带头结点的单链表用的更多,使用也更为方便.因为不用单独考虑第一个节点的情况了,第一个节点和其他后续节点的处理全都一样了,简化操作.这篇博客将会来实现带头结点的单链表的11种操作.代码上传至: https://github.com/chenyufeng1991/LinkedList_HeadNode  .

C++ 模板双向不循环链表!!

CTDChain<T,sort,equal,pointer> * nodeTemp = NULL; ------------------------------------------------------------------------------ using namespace std; //双向不循环链表 //sort 指示是否有序 //equal 指示当出现相同节点时的处理方法 //pointer 指示是否是一个指针类型,在析构时必不可少 template <class T

C语言递归,非递归实现翻转链表

翻转链表作为,链表的常用操作,也是面试常遇到的. 分析非递归分析: 非递归用的小技巧比较多,很容易出错. 递归分析比较简单,在代码里面 代码: #include<stdio.h> #include<stdlib.h> typedef int elemtype; typedef struct node{ elemtype element; struct node*next;//写成node* next;node * next;node *next;也是可以的,为了方便阅读,以后统一写

VC2008以资源形式实现多语言版本(非Unicode) .转

http://blog.csdn.net/jiht594/article/details/7043520对比,本文使用了SetThreadLocale. 越来越多的程序支持多语言切换,或者能自动适应当前系统语言,让自己开发的程序支持多语言不仅可以让自己的程序被国人使用,也能让外国程序爱好者使用.VC开发多语言程序有多种方法,或读取配置文件,或使用不同资源DLL等等.这里介绍以资源形式实现多语言版本. 1.打开Visual Studio 2008,新建一个基于对话框工程,名称为LanguageTe