首页 > 其他分享 >C语言双向链表

C语言双向链表

时间:2024-11-08 18:17:26浏览次数:3  
标签:node head target search C语言 链表 双向 next 节点

一、优势

  与单链表对比,双向链表的增、删、改无需遍历多次以查找目标节点前一节点与后一节点,效率提高,代码对比

*单链表:

1.插入:

void insert(node *head,char Name,int phonenumber,int target) 
{
	node *p=(node*)malloc(sizeof(node));//为新节点分配内存; 
	
	p->next =search(head,target);//使插入节点指向下一个节点; 
	
	node *tar=(search(head,target-1));//找到目标位置的前一个节点;
	 
	tar->next =p;//将前一个节点指向新节点;
	 
	p->name =Name;
	p->phone_number =phonenumber;//写入新节点数据; 
	
}

2.删除:

void delet(node *head,int target) 
{
	node *ahead=search(head,target-1);//找到前一节点;
	 
	node *targ=search(head,target);//找到目标节点; 
	
	ahead->next =search(head,target+1);//将目标节点前一个节点指向下一个节点; 
	
	free(targ);//释放目标节点内存; 
	
}

 

*双向链表

1.插入:

void insert(node *head,char Name,int phonenumber,int target) 
{
	node *p=(node*)malloc(sizeof(node));//为新节点分配内存; 
	
	p->last =search(head,target)->last ;//使插入节点指向上一个节点;
	 
	search(head,target)->last->next  =p;//使上一节点指向新节点;
	
	p->next =search(head,target);//使插入节点指向下一个节点;
	
	search(head,target) ->last=p; //使下一节点指向新节点; 
	
	p->name =Name;
	p->phone_number =phonenumber;//写入新节点数据; 
	
}

2.删除:

void delet(node *head,int target) 
{	 
	search(head,target)->last->next  =search(head,target)->next ;//找到目标节点; 
	
	search(head,target)->next->last  =search(head,target)->last;//将目标节点前一个节点指向下一个节点; 
	
}

二、劣势

1.插入与删除代码相对复杂

2.结构体新增前驱指针,空间利用率相对低(大项目可忽略)

三、代码实现

#include "stdio.h" 
#include "stdlib.h"
typedef struct node{
	char name;
	int phone_number;
	struct node *next;
	struct node *last;
}node;
//定义节点; 

node *search(node *head,int n)
{
	node *result=head ;//从头节点开始遍历查找;
	 
	for(int i=0;i<n;i++){
		result=result->next ;//更新节点地址; 
	}
	
	return result;//返回目标节点的地址;
	 
}
//链表查找;
 
void increase_node(node *head_node,char Name,int phonenumber)\/\/\/\/\/
{
	node *new_node=(node *)malloc(sizeof(node));
	node *judge=head_node;//从头节点开始找到最尾部的节点;
	 
	while(judge->next !=NULL){
		judge=judge->next ;//更新节点; 
	}//遍历查找尾部节点; 
	
	judge->next =new_node;
	new_node->last =judge;//将最尾部的节点指向新节点;
	 
	new_node->name =Name;
	new_node->phone_number =phonenumber;//将数据写入新节点; 
	
	new_node->next =NULL;//将新节点指向空; 
	
}
新增链表;

void insert(node *head,char Name,int phonenumber,int target) 
{
	node *p=(node*)malloc(sizeof(node));//为新节点分配内存; 
	
	p->last =search(head,target)->last ;//使插入节点指向上一个节点;
	 
	search(head,target)->last->next  =p;//使上一节点指向新节点;
	
	p->next =search(head,target);//使插入节点指向下一个节点;
	
	search(head,target) ->last=p; //使下一节点指向新节点; 
	
	p->name =Name;
	p->phone_number =phonenumber;//写入新节点数据; 
	
}
/链表插入;

void delet(node *head,int target) 
{	 
	search(head,target)->last->next  =search(head,target)->next ;//找到目标节点; 
	
	search(head,target)->next->last  =search(head,target)->last;//将目标节点前一个节点指向下一个节点; 
	
}
//删除目标节点; 
void change(node *head,char Name,int phonenumber,int target) 
{
	node *targ=search(head,target);//找到目标节点;
	 
	targ->name =Name;
	targ->phone_number =phonenumber;//写入新数据;
	 
}
//修改节点数据; 
int main(void){
	node *head=(node*)malloc(sizeof(node));
	head->next =NULL;
	head->last =NULL;//创建头节点;
	
    increase_node(head,'A',123456);
    increase_node(head,'B',123456);//新建节点,写入数据;
	 
    insert(head,'C',123456,2);//插入节点 
    
    delet(head,2); //删除目标节点 
    
    node *target=search(head,2);//查找链表;
    
	printf("%c %d",target->name ,target->phone_number );
	return 0;
}

标签:node,head,target,search,C语言,链表,双向,next,节点
From: https://blog.csdn.net/weixin_69044925/article/details/143559553

相关文章

  • C语言 循环高级
    时间:2024.11.6一、学习内容1、无限循环无限循环:循环永远停不下来注意点:无限循环因为永远停不下来,所以下面不能再写其他的代码了2、break跳转控制语句:在循环的过程中,跳到其他语句上执行 #include<stdio.h>intmain(){ intcount=0; inti;//利用for循环去......
  • C语言格式化打印
    C语言格式化打印十进制:%d      int、char%i       有符号的整数%hd    short%ld     long int%lld    long long int%zd    size_t%u      unsigned int%lu     unsigned long int%llu    unsigned long long int八进制:%o......
  • 嵌入式课程day10-C语言数组
    目录七、数组7.1数组是什么?7.2数组的使用7.3定义数组7.4数组初始化7.5冒泡排序7.6二分法查找七、数组7.1数组是什么?存储多个同种类型的数据 ,方便数据处理7.2数组的使用先定义再使用7.3定义数组存储多少数据 数据的数据类型 数组名元素:数组中数据可以统......
  • VS Code/Code-Runner编译C语言遇到undefined reference to XXX的一种解决办法
    背景用VSCode编译一个C语言编写的项目文件,这个项目除main文件外还有些被引用的C文件,如果不做相关配置的话,运行会报错:即编译时找不到被引用的这些文件,从而报错。解决办法我是使用code-runner这个插件跑的,所以这里只写关于用这种方式运行代码的解决办法。首先查看.vscode/配......
  • 二叉树 (王道数据结构 C语言版)
    2004.11.04计算一颗给定二叉树的所有双分支节点个数编写把一个树的所有左右子树进行交换的函数求先序遍历中第k个结点的值(1<=k<=二叉树中的结点个数)#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;typedefstructBitnode{......
  • 用C语言实现汉诺塔问题(第四天:函数递归)【每天进步一点点-小白学习笔记】
    0 前言        最近比较忙,到现在才有时间更新博客,这两天刚好学到了函数递归,这是个很有趣的知识,为什么说有趣呢?因为递归这个东西吧,很多人都对它又爱又恨。爱在递归不仅可以轻松简化代码,增加可读性,还能将一些很难解决的算法问题轻松解决,但它又大大加大了程序复杂度,既......
  • 2个月搞定计算机二级C语言——真题(10)解析qg
    合集-3个月搞定计算机二级C语言(6)1.2个月搞定计算机二级C语言——真题(5)解析10-292.2个月搞定计算机二级C语言——真题(6)解析10-303.2个月搞定计算机二级C语言——真题(7)解析11-034.2个月搞定计算机二级C语言——真题(8)解析11-035.2个月搞定计算机二级C语言——真题(9)解析11-06:Flow......
  • c语言入门学习这一篇就够了-知识点总结(三万字二级必看)
    C语言   C语言是中高级语言的代表之一,它是所有现代编程语言的基石,包括C++、Java、C#、Python、JavaScript、Swift等。C语言是学习其他编程语言的基础,因为它提供了对系统底层的精确控制,这使得它在开发操作系统、驱动程序、嵌入式系统、高性能计算等领域中有着不可替代的......
  • (C语言)内存函数
    目录1)memcpy 1)memcpy的模拟实现2)memmove2)memmove的模拟实现3)memset4)memcmp1)memcpymemcpy是内存拷贝函数,其不同于strncpy在于其能拷贝任意数组;形式:void*memcpy(void*destinatoin,char*source,size_t num);destination是目标空间地址,source是源空间地址;num是拷贝......
  • 重温c语言之,7天开整,就是随便的写写,第八天
    一:函数1、递归题目:求n的阶乘(不考虑溢出)上代码1#include<stdio.h>2intfactorial(intn){3if(n>1){4returnn*(factorial(n-1));5}6else7{8return1;9}10}11#include<stdio.h>12in......