c语言 双向链表的简单操作-创建、插入、删除

数据结构-双向链表的创建、插入和删除

双向链表是数据结构中重要的结构,也是线性结构中常用的数据结构,双向指针,方便用户从首结点开始沿指针链向后依次遍历每一个结点,结点的前驱和后继查找方便。

#include <stdio.h>

#include <stdlib.h>

//双向链表结点的定义

typedef struct dbnode

{

int data;

struct dbnode *prio, *next;

}DbNode, linkdblist;

//创建双向链表

DbNode *creatlist(void)

{

linkdblist *p, *q, *head;

q = p = (linkdblist *)malloc(sizeof(linkdblist));

p->next = NULL;

head = q;

p = (linkdblist *)malloc(sizeof(linkdblist));

scanf("%d", &p->data);

while (p->data != -1)

{

q->next = p;

p->prio = q;

q = p;

p = (linkdblist *)malloc(sizeof(linkdblist));

scanf("%d", &p->data);

}

q->next = NULL;

return head;

}

//输出双向链表

void print(linkdblist *head)

{

linkdblist *p;

p = head->next;

if (p == NULL)

printf("空链表!\n");

while (p != NULL)

{

printf("%d  ", p->data);

p = p->next;

}

}

//向双向链表中的第i个位置插入一个结点x

void insertdblist(linkdblist *head, int x, int i)

{

linkdblist *p, *q = head;

if (i == 1)

q = head;

else

{

q = q->next;

int c = 1;

while ((c<i - 1) && (q != NULL))

{

q = q->next;

c++;

}

}

if (q != NULL && q->next != NULL)

{

p = (linkdblist *)malloc(sizeof(linkdblist));

p->data = x;

p->prio = q;

p->next = q->next;

q->next = p;

q->next->prio = p;

}

else

printf("找不到插入的位置!");

}

//删除双向链表中指定位置上的一个结点

void deletelinkdblist(linkdblist *head, int i)

{

linkdblist *p, *q = head;

if (i == 1)

q = head;

else

{

q = q->next;

int c = 1;

while (c < i - 1 && q != NULL)

{

q = q->next;

c++;

}

}

if (q != NULL && q->next != NULL)

{

p = q->next;

p->prio = q;

p->prio->next = p->next;

p->next->prio = p->prio;

free(p);

}

else if (q->next == NULL)

{

p = q;

p->prio->next = NULL;

free(p);

}

else

printf("没有找到待删除的结点");

}

//双向链表的主函数

void main()

{

linkdblist *head;

head = creatlist();

print(head);

printf("\n\n====向双向链表的某位置插入一个值====\n");

int num, i;

printf("输入插入的位置:");

scanf("%d", &i);

printf("\n输入插入的值:");

scanf("%d", &num);

insertdblist(head, num, i);

print(head);

printf("\n");

printf("\n\n====删除双向链表的某位置上的一个值====\n");

int j;

printf("输入删除的位置:");

scanf("%d", &j);

deletelinkdblist(head, j);

print(head);

system("pause");

printf("\n");

}

原文地址:https://www.cnblogs.com/duanqibo/p/11062479.html

时间: 2024-08-24 11:06:25

c语言 双向链表的简单操作-创建、插入、删除的相关文章

JavaScript之jQuery-3 jQuery操作DOM(查询、样式操作、遍历节点、创建插入删除、替换、复制)

一.jQuery操作DOM - 查询 html操作 - html(): 读取或修改节点的HTML内容,类似于JavaScript中的innerHTML属性 文本操作 - text(): 读取或修改节点的文本内容,类似于JavaScript中的textContent属性 值操作 - val(): 读取或修改节点的value属性值,类似于 JavaScript 中的value值 属性操作 - attr(): 读取或者修改节点的属性 - removeAttr(): 删除节点的属性 二.jQuery操作

C语言----------链表的简单操作

#include <stdio.h> #include <malloc.h> typedef struct node{ //定义节点类型 char data; //数据域 struct node *next; //指针域 }linklist; linklist* Create(){ //创建链表 char key; linklist *phead; //头指针 linklist *pnew; //新节点 linklist *pend; //尾指针 phead = (linklist

c语言 双向链表的基础操作

//头文件 #pragma once typedef int DataType; typedef struct LinkList { DataType _data; struct LinkList* _next; struct LinkList* _prev; }LinkList,*pLinkList; void InitList(pLinkList pNode); pLinkList _BuyNode(pLinkList& pNode,DataType x); void PrintList(p

大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 Elasticsearch 的特点1.7 Elasticsearch 的核心概念1.7.1 近实时1.7.2 Cluster(集群)1.7.3 Node(节点)1.7.4 Index(索引 --> 数据库)1.7.5 Type(类型 --> 表)1.7.6 Document(文档 -->

链表 创建 插入 删除 查找 合并

最近学习了一下单链表的操作,将代码保存如下,供以后查看. 链表创建: 1.先建立一个不含数据的头指针*head,头指针的链接域为NULL. 2.声明一个用于暂存新申请空间的指针*pc,一个用于保存创建的链表的指针*r,令*r指向*head. 3.在循环中,为指针*pc申请空间,并给数据域赋值,head->next = pc, pc->next = NULL, head = pc. #define _CRT_SECURE_NO_DEPRECATE /*取消scanf,printf不安全之类的错误

MySQL入门很简单: 4 创建 修改删除表

1. 创建表的方法 1)创建表的语法形式 首先,选择数据库: USE 数据库名: 创建表: CREATE TABLE 表名 (属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件], 属性名 数据类型 ); 2)设置表的主键 主键用于标识每一个记录, 主键必须唯一. 单字段主键: 主键是由一个字段构成的 语法规则: 属性名 数据类型 PRIMARY KEY 例子: CREATE TABLE example1(stu_id INT PRIMARY KEY, stu_name

[PHP] 数据结构-链表创建-插入-删除-查找的PHP实现

链表获取元素1.声明结点p指向链表第一个结点,j初始化1开始2.j<i,p指向下一结点,因为此时p是指向的p的next,因此不需要等于3.如果到末尾了,p还为null,就是没有查找到 插入元素1.插入元素和查找类似,找到位置后2.生成新的结点s, s->next=p->next p->next=s; 删除元素1.删除元素,找到位置后2.绕过一下,q=p->next p->next=q->next; <?php class Node{ public $data

C语言双向链表简单实现及图示(初始化/插入节点/删除节点)

-------------------------------------------- 双向链表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 和单向链表相比有以下优势: 插入删除不需要移动元素外,可以原地插入删除 可以双向遍历 - - - - -

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历