双向链表的查找及插入

在表中第i个元素之前插入一个元素。主要有三个方面:

  • 头结点及尾结点指针域的变化
  • 查找过程中循环条件的变化
  • 插入元素过程中的指针运算

在表建好以后,调用GetElemP_DuL()函数查找第i个元素,返回第i个元素的地址,否则返回空指针。

如图:

程序:

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef struct DuLNode{
        int data;
        struct DuLNode *prior;
        struct DuLNode *next;
}DuLNode,*DuLinkList;
//建立一个只含头结点的空双向循环链表
int InitList_DuL(DuLinkList &L){
        L=(DuLinkList)malloc(sizeof(DuLNode));
        if(!L){
                exit(OVERFLOW);
        }
        L->prior=L;
        L->next=L;
        return OK;
}
int CreateList_DuL(DuLinkList &L,int n){
        DuLinkList p,q;
        int i;
        printf("Input the datas:");
        q=L;
        for(i=0;i<n;i++){
                p=(DuLinkList)malloc(sizeof(DuLNode));
                scanf("%d",&p->data);
                p->next=q->next;
//              p->next=L->next;
                q->next=p;
                p->prior=q;
                L->prior=p;
                q=p;
        }
                return OK;

}
DuLNode *GetElemP_DuL(DuLinkList L,int i){
        DuLinkList p;
        int j=1;
        p=L->next;
     while(p!=L&&j<i){
                p=p->next;//查找第i个节点
                ++j;
        }
        while(p==L||j>i){
                return ERROR;
        }
        return p;
}

int ListInsert_DuL(DuLinkList &L,int i,int &e){
        DuLinkList p,s;
        if(!(p=GetElemP_DuL(L,i))){
                return ERROR;
        }
        if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))){
                return ERROR;
        }//申请新结点
        s->data=e;//s指向新元素e
        s->prior=p->prior;//开始插入,首先是×s的前驱指针
        p->prior->next=s;
        s->next=p;//×s的后继指针
        p->prior=s;
        return OK;
}
int TraverseList_DuL(DuLinkList L){
        DuLinkList p;
        p=L->next;
        while(p!=L){
                printf("%d",p->data);
                p=p->next;
        }
        return OK;
}
main(){
        int i,n,e;
        DuLinkList L;
        InitList_DuL(L);
        printf("Input the length of the list L:");
        scanf("%d",&n);
        CreateList_DuL(L,n);
        printf("Input the insert location:");
        scanf("%d",&i);
        printf("Input the insert data:");
        scanf("%d",&e);
        if(ListInsert_DuL(L,i,e)){
                printf("Output the datas:");
                TraverseList_DuL(L);
        }else{
                printf("Can‘t insert the data!");
        }
        printf("\n");
}
结果:
[email protected]:~/work/c/doublelianbiao$ ./listinsertnew
Input the length of the list L:4
Input the datas:1 3 5 7
Input the insert location:2
Input the insert data:9
Output the datas:19357
注意:Linux下的段错误:Segmentation fault (core dumped)和Windows下的运行时错误道理是一样,一般都是内存访问越界了导致。肯定是代码的某处逻辑有问题,访问了野指针啊之类的。

时间: 2024-10-30 13:48:35

双向链表的查找及插入的相关文章

重温数据结构:二叉排序树的查找、插入、删除

读完本文你将了解到: 什么是二叉排序树 Binary Sort Tree BST 二叉排序树的关键操作 查找 插入 删除 运行代码测试 一道面试题 总结 Thanks 我们知道,二分查找可以缩短查找的时间,但是有个要求就是 查找的数据必须是有序的.每次查找.操作时都要维护一个有序的数据集,于是有了二叉排序树这个概念. 上篇文章 我们介绍了 二叉树 的概念,二叉树有左右子树之分,想必在区分左右子树时有一定的规则. 现在我们来介绍二叉树的一种特殊形式 - 二叉排序树,了解它的区分策略及常用操作. 什

闭散列表的查找、插入和删除操作的完整C代码

/*闭散列表的建立.查找.插入.删除*/ #include <stdio.h> #define NIL -1 //假设关键字为非负整数 #define DEL -2 typedef int KeyType; KeyType HashTable[13]; //便于验证算法,关键字个数假定为不超过13,哈希表长定为13 //关键字插入函数 void InsertHashTable(KeyType k) { for(int i=0; i<13; i++) if( NIL == HashTabl

二叉查找树(1) - 查找以及插入

在WikiPedia中,对二叉查找树的定义如下: 二叉查找树,是一种基于节点的二叉树,有下面的性质: 节点的左子树中任意节点值小于根节点 节点的右子树中任意节点值大于根节点 左右子树都必须是二叉查找树,不允许存在重复节点. 二叉查找树的上述性质,保证了各节点值的顺序,这样进行查找,求最大值最小值时,会效率更高.如果没有这种顺序,则可能需要将树中的每个节点与指定的查找值进行比较. 查找一个节点值 二叉树中查找一个节点值时,首先与根节点比较,相等则返回根节点.如果根节点小于指定值,则递归的查找右子树

二叉排序树(BST):创建、查找、插入与删除

删除结点的相关操作(左右子树均为非空的删除结点的方法): 算法分析: 下面以实例来说明二叉排序树的创建.查找.插入和删除等相关操作: 如输入关键字序列(45,24,37,12,54,93),然后对其进行相应的操作,程序如下: #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; typedef struct BiTNode { int value; struct B

顺序表的查找、插入、删除、合并操作及其优缺点

顺序表的查找.插入.删除.合并操作,用c++实现相关代码: #include<iostream> using namespace std; //定义线性表顺序存储结构 #define MAXSIZE 100  //线性表最大长度 typedef struct { //线性表占用数组空间 int elem[MAXSIZE]; //记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1 int last; }SeqList; //顺序表的按内容查找运算 //在顺序表L中查找与e

二叉查找树的查找、插入和删除 - Java实现

http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 作者: yangecnu(yangecnu's Blog on 博客园) 出处:http://www.cnblogs.com/yangecnu/ 英文原文的出处:http://algs4.cs.princeton.edu/32bst/ 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的时候具有较高的灵活性,而有序数组在查找时具有较高的效率,本文介绍

B树的查找、插入操作

B树的性质: 根节点至少有两个孩子 每个非根节点有[,M]个孩子 每个非根节点有[-1,M-1]个关键字,并且以升序排列 key[i]和key[i+1]之间的孩子节点的值介于key[i].key[i+1]之间 所有的叶子节点都在同一层 以下代码实现了B树的查找和插入操作,删除操作暂未实现 插入:先找到插入结点的位置,插入后判断关键字的个数是否小于M(M为阶数),小于返回,不小于进行分裂. 删除:任一关键字K的中序前趋(后继)必是K的左子树(右子树)中最右(左)下的结点中最后(最前)一个关键字.

二叉排序树(概念,查找,插入,删除)

查找基本概念 查找表:由同一类型的数据元素构成的集合.对查找表的常用操作:查询元素是否存在.查询元素属性.插入一个数据元素.删除一个数据元素. 查找:也叫检索,是根据给定的某个值,在表中确定一个关键字等于给定值的数据元素. 关键字:可以标识一个数据元素的某个数据项. 主关键字:可以唯一地识别一个数据元素的关键字. 静态查找表:只进行查询某元素在表中与否或检索某元素的各种属性操作的表. 动态查找表:查找时同时进行插入表中无的元素或删除表中有的某元素的表. 二叉排序树 定义:二叉排序树(Binary

二叉排序树的查找、插入和删除

1.      二叉排序树 二叉排序树(Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: (4)没有结点值相同的结点. 二叉排序树又称二叉查找树(Binary Search Tree),亦称二叉搜索树.通常采用二叉链表作为二叉排序树的存储结构.中序遍历二叉排序树可以得到关键字有序的序列,即一个无序序