精华内容
下载资源
问答
  • c语言实现双链表的插入 删除 查询 验证
  • 循环链表是一种头尾相接的链表(即:表中最后一个结点指针域指向头结点,整个链表形成一个环) 优点:从表中任一结点出发均可找到表中其他结点 注意:由于循环链表中没有NULL指针,故涉及遍历操作时,其终止...

    一、循环链表

    • 循环链表是一种头尾相接的链表(即:表中最后一个结点的指针域指向头结点,整个链表形成一个环)

    • 优点:从表中任一结点出发均可找到表中其他结点

    • 注意:由于循环链表中没有NULL指针,故涉及遍历操作时,其终止条件就不再像非循环链表那样判断p或p->next是否为空,而是判断他们是否等于头指针

    • 循环条件

      p!=NULL → p!=L

      p->next!=NULL → p->next!=L

      ​ 单链表 单循环链表

    • 带尾指针循环链表的合并

    LinkList Connect(LinkList Ta,LinkList Tb)
    {
        p=Ta->next;
        Ta->next=Tb->next->next;
        delete Tb->next;
        Tb->next=p;
        return Tb;
    }
    

    二、双向链表

    • 双向链表:在单链表的每个结点里再增加一个指向其前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表

    • 双向循环链表:和单链的循环表类似,双向链表也可以有循环表

      • 让头结点的前驱指针指向链表的最后一个结点
      • 让最后一个结点的后继指针指向头结点
    • 双向链表结构的对称性:

      p->prior->next = p = p->next->prior

    三、双向链表的插入

    void ListInsert_DuL(DuLinkList &L,int i,ElemTyoe e)
    {
        if(!(p=GetElemP_DuL(L,i)))
            return ERROR;
        s=new DuLNode;
        s->date=e;
        s->prior=p->prior;
        p->prior->next=s;
        s->next=p;
        p->prior=s;
        return OK;
    }
    

    四、双向链表的删除

    void ListDelete_DuL(DuLink &L,int i,ElemType &e)
    {
        if(!(p=GetElemP_DuL(L,i)))
            return ERROR;
        e=p->data;
        p->prior->next=p->next;
        p->next->prior=p->prior;
        free(p);
        return OK;
    }
    
    展开全文
  • C/C++双链表双向链表

    2013-01-29 14:59:40
    实现双向链表的基本功能,添加,删除,查找,指定位置插入,打印链表,获取链表长度等等
  • /*双链表的删除 ** 把一个值插入到双链表,rootp是一个指向根节点的指针 ** del 是指向欲移除节点的指针 ** 返回值: ** 如果链表不包含移除的节点,函数就返回假,否则返回真。 */ int dll_remove(Node *rootp, ...
    /*双链表的删除
    ** 把一个值插入到双链表,rootp是一个指向根节点的指针
    ** del 是指向欲移除节点的指针
    ** 返回值:
    ** 如果链表不包含移除的节点,函数就返回假,否则返回真。
    */
    int dll_remove(Node *rootp, Node *del)
    {
        register  Node  *thist;
    	assert( del != NULL);
    	for(thist=rootp->fwd; thist != NULL; thist = thist->fwd)
    	    if(thist == del)
    		      break;
    	if(thist == del)
    	{ 
    		/*
            ** Update fwd pointer of the previous node.
            */
            if( thist->bwd == NULL )
    			rootp->fwd = thist->fwd;
            else
               thist->bwd->fwd = thist->fwd;
             /*
             ** Update bwd pointer of the next node.
             */
            if( thist->fwd == NULL )
                rootp->bwd = thist->bwd;
           else
               thist->fwd->bwd = thist->bwd;
            free( thist );
            return TRUE;
    	}
    	else
    		return FALSE;
    	
    }

     

    展开全文
  • 双向链表list.c

    2021-01-23 19:52:30
    为《仿照linux内核的链表构造并...文件里面有链表声明和初始化、判断链表是否为空、表头插入、表尾插入、遍历、反向遍历、由链表节点到数据项、删除节点详细注解和示例。 在linux下用gcc list.c编译,./a.out运行。
  • 双向链表含义:双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。特点:1)在...

    感谢您的阅读与点赞!欢迎关注:「大猫玩程序」,查看C语言系列文章

    上一节讲了链表的基本概念以及单项链表的使用方法,这一节主要讲解双向链表的使用方法。

    双向链表

    含义:

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

    特点:

    1)在数据结构中具有双向指针2)插入、删除数据的时候需要考虑前后的方向的操作

    用法:

    一个链表结构体的声明

    typedef struct NODE{struct NODE *prev;struct NODE *next;int data;}Node;
    88363e2a4b40a66aa52c68fab19da74a.png

    1.初始化链表:

    int InitNodeList(Node **node){*node=(Node*)malloc(sizeof(Node));//链表分配内存空间if(!*node){return 0;}(*node)->prev=NULL;(*node)->next=NULL; return 1;}

    2.插入数据:

    int InsertNodeList(register Node *root,int data){ register Node *this; register Node *next; register Node *newnode; for(this = root;(next = this->next)!= NULL; this =next) { if(next->data == data) { return 0; }  if(next->data > data) { break; }  } /*新节点分配内存空间*/ newnode = (Node *)malloc(sizeof(Node)); if(newnode == NULL) { return -1; }  /*新节点插入链表*/ newnode->data = data;  /*插入新节点*/ newnode->next = next; this->next = newnode;  if(this != root) { newnode->prev = this; } else { newnode->prev = NULL; }  if(next != NULL) { next->prev = newnode; } else { root->prev = newnode; } return 1;}

    3.获取链表长度

    int LengthNodeList(Node *root){ int i = 0; Node *previous; previous=root->next;/*p指向链表的第一个结点。*/ /*循环链表,直到节点为空*/ while(previous) { i++; previous=previous->next; } return i;}

    4.删除节点:

    void DestroyNodeList(Node *root){ Node *current,*next;  if(root == NULL) { return;  }  current=root;/*current 指向链表的根结点*/ /*当节点指向为空,即到了链表末尾,跳出*/ while(current) { next = current->next;/*指向当前结点的下一个结点。*/ free(current);/*释放当前结点*/ current = next;/*指向下一个结点*/ }}

    5.调用:

    int main(void){Node *root;int node_length = 0;InitNodeList(&root); /*初始化链表,得到一个跟节点*/InsertNodeList(root,10); /*向链表中插入一个数据*/InsertNodeList(root,20); /*向链表中插入一个数据*/node_length = LengthNodeList(root); /*获取链表长度*/printf("%d
    展开全文
  • 具体实现代码如下: #include<stdio.h> #include&...typedef struct DNode{//双链表 int data; struct DNode *prior; struct DNode *next; }DNode; void CreatelistR(DNode *&a...

    具体实现代码如下:

    #include<stdio.h>
    #include<malloc.h>
    using namespace std;
    
    typedef struct DNode{//双链表 
    	int data;
    	struct DNode *prior;
    	struct DNode *next;
    }DNode;
    
    void CreatelistR(DNode *&head,int arr[],int n);//尾插法创建带头结点的单向链表 
    void ShowList(DNode *head);
    
    DNode *searchNode(DNode *head,int x);//查找值为x的节点并返回 
    int insertNode(DNode *&head,int p,int x);//在p位置插入
    int deleteNode(DNode *head,int p); //删除第p个位置的节点 
    
    int main(){
    
    	DNode *head = nullptr;
    	int arr[] = {123,56,7,867,132,9,45,0,314};
    	CreatelistR(head,arr,sizeof(arr)/sizeof(arr[0]));
    	ShowList(head);
    	
    	
    	puts("请输入查找结点的值:");
    	int n;
    	scanf("%d",&n);
    	DNode *p = searchNode(head,n);
    	if(p != nullptr)
    		printf("%d\n",p->data);
    	
    	
    	puts("请输入插入结点的位置和值:");
    	int node;
    	scanf("%d%d",&n,&node);
    	insertNode(head,n,node);
    	ShowList(head);
    	
    	
    	puts("请输入删除结点:");
    	scanf("%d",&n);
    	deleteNode(head,n);
    	ShowList(head);
    	
    	return 0;
    }
    
    int insertNode(DNode *&head,int p,int x){
    	if(p < 1)
    		return 0;
    	if(head == nullptr){
    		head = (DNode *)malloc(sizeof(DNode));
    		head->prior = nullptr;
    		head->next = nullptr;
    	}
    	
    	DNode *pre = head;
    	int i = 1;
    	while(i < p && pre->next != nullptr){
    		pre = pre->next;
    		i++;
    	}
    	
    	DNode *node = (DNode *)malloc(sizeof(DNode));
    	node->data = x;
    	node->next = pre->next;
    	node->prior = pre;
    	
    	if(pre->next != nullptr)
    		pre->next->prior = node;
    	pre->next = node;
    	
    	return 1;
    }
    
    int deleteNode(DNode *head,int p){
    	if(p < 1)
    		return 0;
    	if(head == nullptr || head->next == nullptr)
    		return 0;
    	
    	DNode *pre = head;
    	int i = 0;
    	while(i < p-1 && pre->next != nullptr){
    		pre = pre->next;
    		i++;
    	}
    	
    	if(pre->next == nullptr)
    		return 0;
    	
    	DNode *q = pre->next;
    	pre->next = q->next;
    	if(q->next != nullptr)
    		q->next->prior = pre;
    	free(q);
    	
    	return 1;
    	
    }
    
    void CreatelistR(DNode *&head,int arr[],int n)//尾插法 
    {
    	if(arr == nullptr || n < 0)
    		return;
    	head = (DNode *)malloc(sizeof(DNode));
    	head->prior = nullptr;
    	head->next = nullptr;
    	
    	DNode *temp = head;
    	for(int i=0;i<n;i++)
    	{
    		DNode *node = (DNode *)malloc(sizeof(DNode));
    		node->data = arr[i];
    		node->prior = temp;
    		node->next = nullptr;
    		
    		temp->next = node;
    		temp = node;	
    	}
    }
    
    DNode *searchNode(DNode *head,int x){
    	if(head == nullptr || head->next == nullptr)
    		return nullptr;
    	
    	/*
    	while(head->next != nullptr){
    		if(head->next->data == x)
    			return head->next;
    		head = head->next;
    	}
    	*/
    	
    	DNode *p = head->next;
    	while(p != nullptr){
    		if(p->data == x)
    			return p;
    		p = p->next;
    	}
    	
    	return nullptr;
    }
    
    void ShowList(DNode *head){
    	if(head == nullptr)
    		return;
    	while(head->next != nullptr)
    	{
    		printf("%d ",head->next->data);
    		head = head->next;
    	}
    	puts("");
    	puts("");
    } 
    
    

    运行结果如下:

    展开全文
  • 我(新手上路)觉得链表的理解和掌握借助画图会很好很高效!多动手多观察链表各元素之间的连接关系。 1.单向链表 单向链表结构体的构建核心为一个数据域和一个指针域(指向下一个节点)。 我比较习惯有头指针head...
  • c描述双向链表删除

    2014-03-25 10:49:11
    的删除部分有2个函数,一个是把要删除的数据取出,一个是删除它。请教各位!能判断是代码末尾的那个函数有问题? #include #include struct node { int value; struct node * prior; struct node * next; }...
  • 双向链表C实现

    2018-02-04 13:10:54
    产品级代码,安全可靠,包含如下功能: 1.创建链表 2.销毁链表 3.获取链表长度 4.清空链表 5.获取第pos个元素操作 6.插入元素到位置pos 7.删除位置pos处元素 ...12.直接指定删除链表某个数据元素
  • 双向链表的C实现

    2013-10-18 23:02:29
    本文用C语言实现了双向链表的create 创建、display 遍历、search 查找节点、del 删除节点、insert 插入节点,实现及测试程序如下: #include #include typedef struct dlink { int num; struct dlink ...
  • 双链表的创建、初始化、遍历插入、删除C/C++) 已经全部测试过,代码没有问题。。。 #include <iostream> using namespace std; struct DulNode { int data; DulNode* prior; DulNode* next; }; //双向...
  • 双链表的基本操作的实现,这个程序中演示了双链表的初始化、双链表的创建、删除、查找以及输出等功能。使用c语言所写。
  • 双向链表 c

    2015-01-14 17:06:00
    双向链表的插入、删除、查找。要求关联一起。插入、删除、查找用注释标出来。短小,简单易懂。 #include <stdio.h>#include <string.h>typedef struct person person;struct person { char name[10]; ...
  • c:双向链表

    2019-01-07 17:22:15
    构建一个双向链表并进行删除和插入操作,按要求输出。 输入 输入: 第一行输入元素个数M 第二行输入M个元素 第三行输入删除位置 第四行输入插入位置和插入元素 第五行输入输出时起始位置 输出 按要求起始位置...
  • c/c++ 双向链表 创建 插入 删除

    千次阅读 2017-08-03 14:12:14
    同单链表操作方法类似,不过在结点中加入了一个指向结点前驱指针。 #include #include #include #include #include using namespace std; typedef struct student { int data; struct student *next; ...
  • 最近在面试过程中总被问到链表的问题,因此这里把自己实现的链表操作上传给大家共享!包括单链表,双链表,循环单链表,循环双链表的(可重复)插入和(可重复)删除的完整实现,由c及Code::Blacks实现.
  • 双向链表 循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是O(n)。如果希望从表中快速确定某一个结点的前驱,另一个...双链表的结构定义如下: //建立一个线性双向链表的存储结构
  • 试编写程序,创建双向循环链表,依次将输入的整数存储在该链表的各节点中。然后,将第一个结点删除并插入链表中的适当位置,使整个链表递增有序。 【输入形式】先输入整数的个数,再输入整数列。 【输出形式】以...
  • 本资源将双向链表定义为node.h头文件,把对双向链表的各种操作写入不同的.c文件,并用过extern实现接口调用,主函数控制台方式自由添加、查找、遍历、删除、释放空间。
  • 双链表的C语言的实现

    2011-05-28 18:03:22
    双链表的C实现有头插,尾插,删除。可用于堆栈,队列
  • 头部插入(四)双链表的算法之遍历节点(五)双链表的算法之删除节点 (一)双链表的引入和基本实现 1.单链表的局限性 单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题。使用堆内存来存储数据...
  • 双向链表

    2018-07-30 21:10:27
    双向链表的头插尾插和删除。 关于链表这一块,其实很简单,只要记得操作的时候,先对新的结点操作,再操作前后。 没有编译。可能有问题,仅供参考。 /********************************************************...
  • 链表的简单介绍二:c中单链表的实现三.(1)C++中单链表的实现(2)c++中双链表的实现四c++中list和forward的一般使用规则 写在前面:在我看来链表就是对指针操作的练习,能很好的实现和使用链表将能更好地使用指针...
  • 数据结构双链表基本操作(C/C++实现) 注意:本代码为了测试运行默认含有操作所需数据,如有需要可自己增删改相关数据 ...删除双链表的第n个元素 输出双链表 释放双链表 GitHub地址(包含.cpp文件和可执行程...
  • c++实现双向链表,类模板双向链表

    千次阅读 2016-09-06 20:10:23
    c++实现双向链表的思想和c很类似,不同的是c++是将实现的函数放在类中,这样就可以由类实例化出对象再调用类中的函数进行添加、删除、查找、插入元素等功能。类模板实现双向链表在最后进行说明和实现,方法依然类似...
  • 双向链表(2) - 删除节点

    千次阅读 2015-06-14 00:29:44
    在双向链表删除一个指定节点,可以分为下面这3种情况: (a) 原始双向链表 (b) 删除头节点后 (c) 删除中间节点后 (d) 删除尾节点后 算法 假设需要被删除的节点称之为delNode. 1) 如果delNode为头...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 559
精华内容 223
关键字:

双链表的删除c