精华内容
下载资源
问答
  • 删除算法
    千次阅读
    2020-08-09 22:40:01
    #include<stdio.h>
    #include <malloc.h>
    #define SIZE  100
    #define  INCREMENT_SIZE 10
    
    typedef struct{
    	int *elem; 
    	int length;
    	int listsize;
    }Sqlist;
    
    bool InintList_Sq(Sqlist &L){
    	L.elem = (int*)malloc(SIZE*sizeof(int));
    	if(!L.elem)
    		return false;
    	L.length = 0;
    	L.listsize = SIZE;
    	return true;
    }
    
    bool Delete(Sqlist &L,int pos,int &data){
    	int *newbase;
    	if(pos < 1||pos > L.length+1)
    		return false;
    	int *q = &L.elem[pos-1];
    	data = *q;
    	for(int *p=q;p<&L.elem[L.length-1];p++)
    		*(p) = *(p+1);
    	L.length--;
    	return true;
    }
    int main(){
    	int pos;int data;
    	Sqlist sql;
    	InintList_Sq(sql);
    	printf("请输入输入数据的个数:"); 
    	scanf("%d",&sql.length);
    	for(int i=0;i<sql.length;i++)
    		scanf("%d",&sql.elem[i]);
    	printf("\n");
    	for(int i=0;i<sql.length;i++)
    		printf("%d ",sql.elem[i]);
    	printf("\n");
    	printf("请输入输入数据的删除位置:"); 
    	scanf("%d",&pos);
    	Delete(sql, pos, data);
    	for(int i=0;i<sql.length;i++)
    		printf("%d ",sql.elem[i]);
    	printf("\n");
    	return 0;
    }

     

    更多相关内容
  • 顺序表的按值删除(算法与数据结构) 顺序表的按值删除(算法与数据结构) PAGE / NUMPAGES 顺序表的按值删除(算法与数据结构) 顺序表的按值删除 #include<iostream> using namespace std; const int MaxSize=200; class...
  • 二叉排序树的删除算法

    千次阅读 2020-04-15 19:16:01
    关于二叉排序树的定义以及如何查找指定关键字的结点不再赘述,本篇文章主要讨论二叉排序树如何删除一个指定的结点。

    关于二叉排序树的定义以及如何查找指定关键字的结点不再赘述,本篇文章主要讨论二叉排序树如何删除一个指定的结点。

    当我们利用查找算法在树中找到了对应的结点的时候,可能会遇到三类情况。

    第一类情况:

    即将删除的结点是叶结点,将他删除以后,并不影响其他结点。(若为根结点,则整棵树为空,若不为根结点则其双亲结点对应的指针域指向空)
    下面的结点2就是这种情况。
    在这里插入图片描述
    第二类情况:

    被删除的结点仅有一棵子树(左子树或者右子树),那么就将当前结点删除,如果当前结点是根结点,那么它子树的根结点,成为新的根结点。如果不是根结点,那么它双亲结点指向它的指针改为指向它的子树根结点。
    将根结点7删除以后,2便成了新的根结点
    在这里插入图片描述
    在这里插入图片描述
    这里值得注意的是,以上述为例,因为4是3的左子树,那么这棵树上所有的点必将大于3,所以5可以成为3的右子树。

    最后一种情况:

    待删除结点的左右子树俱全,这种情况可以有两种处理方法,以当前结点为根结点的子树的结点数据大小是,左子树 < 根 < 右子树
    如果要把根删除,则可以从左子树中找到一个最大的结点,或者右子树中一个最小的结点来替换根结点。

    以上三种情况均需要记录删除结点的双亲结点。

    下面开始根据思路撸代码:

    typedef struct SearchNode{
        int data;
        struct SearchNode *left,*right;
        explicit SearchNode(int val):
        data(val),left(nullptr),right(nullptr){}
    }SearchNode,*SearchTree;
    
    
    用于返回查找到的结点 parent指针记录双亲结点
    
    SearchNode * Order_Search(SearchNode * root,int val,SearchTree & parent){
        while(root){
            if(root->data == val)return root;
            parent = root;
            if(root->data > val)root = root->left;
            else root = root->right;
        }
        return nullptr;
    }
    用于返回下面用到的第一个中序遍历的结点
    SearchNode * Get_First_Mid(SearchNode * root){
    	while(root->left)root = root->left;
    	return root;
    }
    void Delete_Node(SearchNode & root,int val){
    	if(root == nullptr)return;
    	SearcNode * parent = nullptr;/* 记录待删除结点的双亲结点 */
    	SearchNode * target = Order_Search(root,val,parent);
    	if(!target)return;//如果待删除结点不存在,那么直接返回
    	待删除结点为叶结点,直接删除,并把双亲结点的指针指向空
    	if(!target->left && !target->right){
    		if(!parent){
    		//targetw为根结点
    		root = nullptr;
    		}else{
    			if(parent->left == target)parent->left = nullptr;
    			if(parent->right == target)parent->right = nullptr;
    		}
    		free(target);
    		return;
    	}
    	//当只有左子树的时候
    	if(!target->right && target->left){
    		//待删除结点是根结点
    		if(!parent)root = target->left;
    		else{
    			if(parent->left == target)parent->left = target->left;
    			if(parent->right == target)parent->right = target->left;
    		}
    		free(target);
    		return;
    	}
    	//当只有右子树的时候,与只有左子树逻辑是一样的
    	if(target->right && !target->left){
    		//待删除结点是根结点
    		if(!parent)root = target->right;
    		else{
    			if(parent->left == target)parent->left = target->right;
    			if(parent->right == target)parent->right = target->right;
    		}
    		free(target);
    		return;
    	}
    	最后一种情况便是左右孩子俱全
    	SearchNode * first = Get_First_Mid(target->right);//获得右子树中中序遍历的第一个结点
    	if(!parent)root = first;
    	else{
    		if(parent->left == target)parent->left = first;
    		else parent->right = first;
    	}
    	Delete_Node(target->right,first->val);//这是往下递归删除,直至回到第一类或者第二类情况
    	free(target);
    }
    

    算法的难点在于三种情况的分析,并且每种情况都必须考虑,待删除结点是否为根节点。
    第三类情况是递归删除的思想,直到待删除结点变成第一种或者第二种情况。

    展开全文
  • 单链表的删除算法

    千次阅读 2020-05-15 13:22:01
    单链表的删除操作 r=p->next; p->next=p->next->next; free®; 理解 先把 r 保存起来 p的next指向了p的下一个next 释放掉r 没有释放会有内存泄露。

    单链表插入点这里单链表插入元素

    单链表的删除操作

    r=p->next;
    p->next=p->next->next;
    free®;
    在这里插入图片描述

    理解

    先把 r 保存起来
    p的next指向了p的下一个next
    释放掉r 没有释放会有内存泄露。

    如果对你有帮助,请 点赞 支持一下

    展开全文
  • 数据结构 顺序表的插入与删除算法的C语言实现,该文档与《数据结构(C语言版)》相配套,基于课本实例
  • AVL算法插入删除算法

    2014-09-29 20:51:13
    AVL算法,实现了正常的插入删除算法,代码运行正常,为算法导论上的一道题
  • 单链表的删除算法Delete

    千次阅读 2018-10-25 22:20:31
    1.删除操作 删除操作是将单链表的第i个结点删除。因为在单链表中结点ai的存储地址在其前驱结点ai-1的...2.删除算法的时间主要消耗在查找正确的删除位置上,故时间复杂度亦为O(n)。单链表删除算法的C++描述如下: ...

    1.删除操作
    删除操作是将单链表的第i个结点删除。因为在单链表中结点ai的存储地址在其前驱结点ai-1的指针域中,所以必须首先找到ai-1的存储地址p,然后令p的next的域指向ai的后继结点,即把结点ai从链上摘下,最后释放结点ai的存储空间。
    算法用伪代码描述如下:
    在这里插入图片描述
    2.删除算法的时间主要消耗在查找正确的删除位置上,故时间复杂度亦为O(n)。单链表删除算法的C++描述如下:

    在这里插入图片描述

    展开全文
  • 写的用于求多条最短路径的删除算法,还有dijstra算法,更新最短路径树等子函数实现
  • Status ListDelete(LinkList *L,int i,ElemType *e) //单链表删除 { int j; LinkList p,q; p = *L; j = 1; while (p->next && j ) { p = p->next; ++j;} if (!(p->next) || j > i) return ERROR; q = p->next; p...
  • 红黑树插入删除算法

    2014-09-27 11:27:36
    红黑树插入删除算法,算法导论上算法,可以运行
  • 单链表的插入与删除算法

    万次阅读 2015-10-11 12:41:08
    2,单链表的删除算法  算法描述:在一个带头结点的单链表中,删除表中第i个结点,返回删除结点的值,并输出删除后的单链表。  代码如下:   #include #include #define SIZE 100 #define INCREMENT_...
  • 将串S中从第i个字符起长度为len的字串删除 void strdelete(seqstring *S,int i,int len) { int k; if(i|| i>S->length || i+len-1>MAXSIZE) { printf("can not delete\n"); return ; } for(k=i-1;k...
  • 平时我们在计算单链表的第i个节点删除时间复杂度时一般认为是O(n),过程如下 1.先从头节点开始遍历链表,找到第i-1个节点 2.将第i-1节点next指向第i个节点的next 可以看到时间主要花在了遍历链表上 如果我们...
  • 算法中包含了平衡二叉树的插入与删除算法,其中删除算法为本人独立编写。
  • 二叉搜索树(BST)的删除算法原理解析

    万次阅读 2016-11-03 23:36:37
    二叉搜索树的删除算法主要分两种情况: 1、要删除的节点只有一个孩子(左孩子或右孩子),这种情况比较简单,只需要将该孩子连接到当前节点的父节点即可。 下面重点讲讲第二种情况: 2、第二种情况便是要删除的...
  • 在上学期,用马丁的删除算法实现了K可靠最短路径。 这学期为了进行进一步算法比较,决定用最原始的YEN算法来计算K最短路径,算法最早提出人是YEN,于是算法因此而命名。 在查阅了大量资料后,终于搞明白了算法的...
  • case 4:cout请输入删除位置:"; cin>>i; ListDelete(L,i); break; case 0:break; default:cout你的选择有错,请重新选择!" ; } cout请输入你的选择:"; cin>>x; } return 0; }
  • #include using namespace std; typedef int elementType; typedef struct lnode { elementType data; struct lnode *next; }Lnode,*LinkList; void create(LinkList &L) { LinkList r,p;... L=n
  • 双向链表结点的插入和删除算法

    万次阅读 多人点赞 2018-10-03 23:47:46
    双向链表的插入与删除 双向链表的结点定义 #define ElemType int //双向链表的存储结构 typedef struct DuLNode { ElemType data; DuLNode *prior; DuLNode *next; }DuLNode, *DuLinkList; 双向链表...
  • 易语言算法入门(3) 删除运算.rar
  • 链表删除指定元素算法

    千次阅读 2019-06-07 14:23:22
    链表删除指定元素算法 我们只需要分情况理清楚就很简单 在算法分析的时候记清楚自己的思路是最重要的 只要链表里有一个元素与给定的元素不相同 第一次与给定元素不相同的节点就为头节点 1:改变头节点 2:不改变头...
  • 代码里有二叉排序树插入操作递归算法,二叉排序树插入操作非递归算法,二叉排序树删除操作,创建二叉排序树,二叉排序树查找递归算法,二叉排序树查找非递归算法
  • 【实验】编写双链表的结点查找和删除算法
  • BST的概念BST,又叫平衡二叉树,是一种循关键码访问的二叉树,并且要求保持顺序性,即任一...BST的查找算法BinNodePos(T) BST_Search1(BinNodePos(T)&amp;v,const T&amp; e,BinNodePos(T)hot) {  if(v==n...
  • 该资源描述了红黑树插入删除的伪算法,并提供相关图示
  • 顺序表的插入,删除算法

    千次阅读 2015-10-11 12:37:05
    1,顺序表的插入算法:  算法描述:在一个顺序表的第i个元素前插入元素e,并打印新的顺序表中的元素#include #include #define SIZE 100 #define INCREMENT_SIZE 10 typedef struct { int *elem; int length; ...
  • 易语言算法入门(3) 删除运算源码,算法入门(3) 删除运算,删除数据
  • Java基础|递归算法删除文件夹及其子文件。
  • 标记清除算法(Mark-Sweep)

    千次阅读 2021-12-31 07:23:39
    标记清除算法(Mark-Sweep)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 809,407
精华内容 323,762
关键字:

删除算法

友情链接: NonlinearFittingTID2013.rar