双链表的基本操作

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 typedef struct line{
  4     struct line * prior;
  5     int data;
  6     struct line * next;
  7 }line;
  8 //双链表的创建
  9 line* initLine(line * head);
 10 //双链表插入元素,add表示插入位置
 11 line * insertLine(line * head,int data,int add);
 12 //双链表删除指定元素
 13 line * delLine(line * head,int data);
 14 //双链表中查找指定元素
 15 int selectElem(line * head,int elem);
 16 //双链表中更改指定位置节点中存储的数据,add表示更改位置
 17 line *amendElem(line * p,int add,int newElem);
 18 //输出双链表的实现函数
 19 void display(line * head);
 20 int main() {
 21     line * head=NULL;
 22     //创建双链表
 23     head=initLine(head);
 24     display(head);
 25     //在表中第 3 的位置插入元素 7
 26     head=insertLine(head, 7, 3);
 27     display(head);
 28     //表中删除元素 2
 29     head=delLine(head, 2);
 30     display(head);
 31
 32     printf("元素 3 的位置是:%d\n",selectElem(head,3));
 33     //表中第 3 个节点中的数据改为存储 6
 34     head = amendElem(head,3,6);
 35     display(head);
 36     return 0;
 37 }
 38 line* initLine(line * head){
 39     head=(line*)malloc(sizeof(line));
 40     head->prior=NULL;
 41     head->next=NULL;
 42     head->data=1;
 43     line * list=head;
 44     for (int i=2; i<=5; i++) {
 45         line * body=(line*)malloc(sizeof(line));
 46         body->prior=NULL;
 47         body->next=NULL;
 48         body->data=i;
 49
 50         list->next=body;
 51         body->prior=list;
 52         list=list->next;
 53     }
 54     return head;
 55 }
 56 line * insertLine(line * head,int data,int add){
 57     //新建数据域为data的结点
 58     line * temp=(line*)malloc(sizeof(line));
 59     temp->data=data;
 60     temp->prior=NULL;
 61     temp->next=NULL;
 62     //插入到链表头,要特殊考虑
 63     if (add==1) {
 64         temp->next=head;
 65         head->prior=temp;
 66         head=temp;
 67     }else{
 68         line * body=head;
 69         //找到要插入位置的前一个结点
 70         for (int i=1; i<add-1; i++) {
 71             body=body->next;
 72         }
 73         //判断条件为真,说明插入位置为链表尾
 74         if (body->next==NULL) {
 75             body->next=temp;
 76             temp->prior=body;
 77         }else{
 78             body->next->prior=temp;
 79             temp->next=body->next;
 80             body->next=temp;
 81             temp->prior=body;
 82         }
 83     }
 84     return head;
 85 }
 86 line * delLine(line * head,int data){
 87     line * temp=head;
 88     //遍历链表
 89     while (temp) {
 90         //判断当前结点中数据域和data是否相等,若相等,摘除该结点
 91         if (temp->data==data) {
 92             temp->prior->next=temp->next;
 93             temp->next->prior=temp->prior;
 94             free(temp);
 95             return head;
 96         }
 97         temp=temp->next;
 98     }
 99     printf("链表中无该数据元素");
100     return head;
101 }
102 //head为原双链表,elem表示被查找元素
103 int selectElem(line * head,int elem){
104 //新建一个指针t,初始化为头指针 head
105     line * t=head;
106     int i=1;
107     while (t) {
108         if (t->data==elem) {
109             return i;
110         }
111         i++;
112         t=t->next;
113     }
114     //程序执行至此处,表示查找失败
115     return -1;
116 }
117 //更新函数,其中,add 表示更改结点在双链表中的位置,newElem 为新数据的值
118 line *amendElem(line * p,int add,int newElem){
119     line * temp=p;
120     //遍历到被删除结点
121     for (int i=1; i<add; i++) {
122         temp=temp->next;
123     }
124     temp->data=newElem;
125     return p;
126 }
127 //输出链表的功能函数
128 void display(line * head){
129     line * temp=head;
130     while (temp) {
131         if (temp->next==NULL) {
132             printf("%d\n",temp->data);
133         }else{
134             printf("%d->",temp->data);
135         }
136         temp=temp->next;
137     }
138 }

原文地址:https://www.cnblogs.com/wy0526/p/11788493.html

时间: 2024-11-10 14:32:42

双链表的基本操作的相关文章

C实现头插法和尾插法来构建非循环双链表(不带头结点)

在实际使用中,双链表比单链表方便很多,也更为灵活.对于不带头结点的非循环双链表的基本操作,我在<C语言实现双向非循环链表(不带头结点)的基本操作>这篇文章中有详细的实现.今天我们就要用两种不同的方式头插法和尾插法来建立双链表.代码上传至  https://github.com/chenyufeng1991/HeadInsertAndTailInsertDoubleList  . 核心代码如下: //尾插法创建不带头结点的非循环双向链表 Node *TailInsertCreateList(No

C++ 双链表基本操作

上一篇博客主要总结了单向链表,这次再总结一下双向链表. 1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h>

实例讲解C++ 双链表基本操作

1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. 结构图如下所示: 2.基本操作实例 DoubleList.cpp #include "stdafx.h" #include "DoubleList.h" #include <stdio.h> #include <malloc.h>

日常学习随笔-数组、单链表、双链表三种形式实现栈结构的基本操作

一.栈结构 栈(stack)是限制插入和删除只能在一个位置上的表,该位置是 表的末端,叫做栈的顶(Top).对栈的基本操作有push(进栈),pop(出栈),peak(栈顶元素),size(栈容量)等. 栈的核心思想:"先进后出". 二.案例一:数组实现"栈" 1 package com.xfwl.algorithmAnalysis.stack; 2 3 import java.util.Arrays; 4 5 /** 6 * 自定义栈结构(基于数组的形式) 7 *

数据结构学习之双链表基本操作

数据结构学习之双链表基本操作 0x1 前言 今天实验课,学习了下双链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的双链链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)

双链表基本操作

#include <stdlib.h> #include <iostream> using namespace std; #define null 0 #define MAXSIZE 50 struct strlnode { int data; struct strlnode *plast; struct strlnode *pnext; }; void create(struct strlnode **p, int x) /*创建双链表(表头节点)*/ { struct strl

[C++11][数据结构]自己的双链表实现

这个双链表,是我模仿stl的list制作的,只实现了一些基本功能,像merge,transfer这些就没有实现,用户可以用基本操作来自己做外部实现. 我没有选用stl的[begin,end)迭代器模式,而是使用传统的[head,tail].不过,为了配合stl算法,我还是加了两个begin(),end()方法,模拟了一下stl容器.模拟的还算及格,至少我可以做类似for (; begin != end; ++begin)这样的事,也可以让我的容器搭配一些stl算法,这在之后的demo里可以看到.

双链表的实现

双链表:可以从一个表结点出发,在线性表中随意访问它的前驱结点和后继结点,双链表有两个指针. 双链表结template<class Elem> class Link   private:       static Link<Elem>* freelist ;//Head of the freelis   public: Elem element;//value for this node Link *next;//pointer to next node in list Link *

优先双链表

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