双链表的插入

预编译

#include <stdlib.h>
#include <stdio.h>
#define status int
#define TRUE 1
#define FALSE 0

typedef struct NODE{
    int value;            /* 存放结点值 */
    struct NODE *prev;  /* 指向前一个结点 */
    struct NODE *next;  /* 指向下一个结点 */
}Node;

数据结构

 1 /*
 2 功能描述:
 3     插入新结点( 从小到大 )
 4
 5 参数:
 6     rootp -- 指向根结点的双指针
 7     new_value -- 要插入链表的新值
 8
 9 返回值:
10     如果插入成功,返回TRUE;
11     否则,返回FALSE
12 */
13 status
14 Insert( Node **rootp, int new_value )
15 {
16     Node *current = *rootp;
17     Node *_new = NULL;
18
19     /* 寻找插入位置 */
20     while ( current != NULL ){
21         if ( current->value > new_value )
22             break;
23
24         if ( current->value == new_value ){
25             printf( "值%d已存在\n", new_value );
26             return FALSE;
27         }
28         current = current->next;
29     }
30
31     /* 创建新结点 */
32     _new = (Node *)malloc( sizeof( Node ) );
33     if ( _new == NULL ){
34         printf( "内存不够\n" );
35         return FALSE;
36     }
37     _new->value = new_value;
38
39     /* 插入新结点 */
40     if ( current == NULL ){
41         if ( current == *rootp ){    /* 插入到空链表 */
42             *rootp = _new;
43             _new->prev = _new;
44             _new->next = NULL;
45
46         }else{                        /* 插入到尾部 */
47             _new->next = NULL;
48             _new->prev = (*rootp)->prev;
49             (*rootp)->prev->next = _new;
50             (*rootp)->prev = _new;
51         }
52     }else{
53         if ( current == *rootp ){    /* 插入到根结点前 */
54             _new->prev = (*rootp)->prev;
55             _new->next = current;
56             current->prev = _new;
57             *rootp = _new;
58
59         }else{                        /* 插入到中间某个结点前 */
60             _new->prev = current->prev;
61             current->prev->next = _new;
62             _new->next = current;
63             current->prev = _new;
64         }
65     }
66
67     return TRUE;
68 }

插入代码

 1 /*
 2 功能描述:
 3     插入新结点( 从小到大 )
 4
 5 参数:
 6     rootp -- 指向根结点的双指针
 7     new_value -- 要插入链表的新值
 8
 9 返回值:
10     如果插入成功,返回TRUE;
11     否则,返回FALSE
12 */
13 status
14 Insert( Node **rootp, int new_value )
15 {
16     Node *current = *rootp;
17     Node *_new = NULL;
18
19     /* 寻找插入位置 */
20     while ( current != NULL ){
21         if ( current->value > new_value )
22             break;
23
24         if ( current->value == new_value ){
25             printf( "值%d已存在\n", new_value );
26             return FALSE;
27         }
28         current = current->next;
29     }
30
31     /* 创建新结点 */
32     _new = (Node *)malloc( sizeof( Node ) );
33     if ( _new == NULL ){
34         printf( "内存不够\n" );
35         return FALSE;
36     }
37     _new->value = new_value;
38
39     /* 插入新结点 */
40     if ( current == NULL ){            /* 插入根结点或尾结点 */
41         if ( current != *rootp ){
42             (*rootp)->prev->next = _new;
43         }
44         _new->prev = (current == *rootp) ? _new : (*rootp)->prev;
45         _new->next = NULL;
46         ((current == *rootp) ? *rootp : (*rootp)->prev ) = _new;
47
48     }else{                            /* 插入到根结点或中间结点之前 */
49         _new->prev = current->prev;
50         ((current == *rootp) ? current->prev : current->prev->next ) = _new;
51         _new->next = current;
52         ((current == *rootp) ? *rootp : current->prev ) = _new;
53     }
54
55     return TRUE;
56 }

优化后的插入代码

时间: 2024-08-07 12:26:58

双链表的插入的相关文章

双链表删除/插入节点

//双链表删除节点 dnode *del(dnode *head, int num) { dnode *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p1 = p1->next; } if (num == p1->data) { if (p1 == head) { head = head->next; head->pre = NULL; free(p1); } else

java数据结构与算法之双链表设计与实现

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??上一篇文章分析顺序表和单链表,本篇就接着上篇继续聊链表,在单链表

双链表的简单应用

/*当对单链表理解后,对双链表就好理解多了,单链表就是只有在结构体或者类中只有一个指针用来存储下一个节点的地址,双链表就是在里面有两个指针,一个用来存储上一个节点的地址,一个用来存储下一个节点的地址.这样的链表就叫双链表.*/ #include<iostream> using namespace std; struct Node { int a; Node *prior,*next;         //前指针,后指针 }; int main() { Node *first,*r,*p; fi

双链表操作(转)

双链表的初始化,建立,插入,查找,删除. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 8

双链表(二)

双链表的插入新节点与删除节点 关于插入新节点,双链表和单链表用到的方法一样,唯一不同的是双链表还需要将指向前一个数据节点的指针里面存放的地址按照逻辑进行交换 关于删除节点,单链表用到了两个指针,一个指针指向需要删除的某一个节点,另一个指针指向删除前面一个节点,才可以做到整个链表不会乱,双链表因为有一个指针是指向前面一个节点的,因此就不需要再重新声明一个指针. 插入节点: void node_insert(node* head, int n) //n用来指明在哪一个数据节点后面创建 { node

【数据结构】用C++实现双链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等)

//[数据结构]用C++实现双链表的各种操作(包括头删,尾删,插入,逆序,摧毁,清空等等) //头文件 #ifndef _LIST_H #define _LIST_H #include<iostream> using namespace std; template<class Type> class DList; template<class Type> class ListNode { friend class DList<Type>; public: L

(六)双链表的结构和插入节点

(六)双链表的结构和插入节点 双链表结构双链表算法之插入节点(尾部插入)双链表算法之插入节点(头部插入) 双链表结构 ??双链表并不是有两个链表,而是有两个遍历方向的链表,因此我们说的双链表其实是双向链表的简称. 单链表节点 = 有效数据 + 指针(指向下一个节点) 双链表节点 = 有效数据 + 两个指针(分别指向前一节点和后一节点) 1/* 2 *双链表节点 3 */ 4struct node 5{ 6    int data; 7    struct node *pPrev; 8    st

优先双链表

题目: 设有一个双链表,每个结点中除有prior,data和 next这3个域外,还有一个访问频度域 freq,在链表被启用前其值均初始化为0.每当在在链表上进行一次查找操作Locate(L, x)时,令元素值为x的结点中的freq域的值增加1,并使此链表中的结点保持按访问频度域递减的顺序排列,以便使频繁访问的结点总是靠近表头 (1)首先创建一个双链表. (2) 设计一个符合上述要求的Locate(L, x)函数. (3) 具有输出显示访问频度功能. (4) 要求程序通过一个主菜单进行控制,在主

线性表—双链表

1.基础知识 a.双链表结点的结构:其由前序元素地址,数据域,后继元素地址组成. b.双链表结点的连接方法:先声明该结点,可以在内部也可以利用其特性来表明前序结点和后继结点是什么,之后同时还需要说明"其前序结点的后继地址为该结点"和"其后继结点的前序地址为该结点.(本质:双向) 2.循环双链表的实现 线性表接口LList package com.clarck.datastructure.dlinked; /*** 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数