精华内容
下载资源
问答
  • 在单链表中按值删除
    2020-09-25 15:55:00
    typedef struct LNode
    {
    	ElemTpye data;
    	struct LNode *next;
    }LNode,*LinkList;
    LinkList Del_Com(LinkList &L)
    {
    	LNode *p,*q,*s;
    	for(p=L->next;p!=NULL;p=p->next)
    	{
    		for(q=p->next,s=p;q!=NULL;q=q->next)
    		{
    			if(q->next->data==p->next->data)
    			{
    				s->next=q->next;
    				free(q);
    				q=s->next;
    			}
    			else
    			{
    				s=q;
    				q=q->next;
    			}
    		}
    	}
    }

     

    更多相关内容
  • 已有的单链表中删除所有为x的元素,代码如下: class Node(object): # 初始化结点 def __init__(self,num): self.num=num self.next=None class SingleLinkedList(object): # 初始化头结点 def __init__...
  • 设计在单链表中删除值相同的多余结点的算法

    千次阅读 多人点赞 2020-04-12 15:01:01
    这是一道算法题,写算法...这是一个无序的单链表,我们采用一种最笨的办法,先指向首元结点,其元素为2,再遍历该结点后的所有结点,若有结点元素与其相同,则删除;全部遍历完成后,我们再指向第二个结点,再进...

    这是一道算法题,写算法题最恨没有图解,懂的人不需要看你的文章,不懂的你再怎么讲解也没有几张图解来得简单易懂,下面来分析一下这道题。

    我暂时还没有更好的解决方案,虽然有一个办法解决,但是时间复杂度有点高,先看看我的思路吧。

    在这里插入图片描述
    这是一个无序的单链表,我们采用一种最笨的办法,先指向首元结点,其元素值为2,再遍历该结点后的所有结点,若有结点元素值与其相同,则删除;全部遍历完成后,我们再指向第二个结点,再进行同样的操作。

    看图解:
    在这里插入图片描述
    这里有两个指针变量p、q,均指向单链表的首元结点,我们先不移动指针p,而是让指针q去遍历之后的所有结点。

    在这里插入图片描述
    先让指针p指向的结点与后一个结点比较,这里为了操作方便,我们暂且先不移动指针q,而是这样进行比较:p -> data == q -> next -> data;若不相等,则让q指向下一个结点:p = p->next;若相等,则应该先保存下一个结点:r = q -> next,然后让q指针指向下一个结点的下一个结点:q = r -> next,并释放r指向的结点内存。

    这样就成功删除了一个与首元结点重复的结点,接下来以同样的方式继续比较,直到整个单链表都遍历完毕,此时单链表中已无与首元结点重复的结点;然后我们就要修改p指针的指向,让其指向首元结点的下一个结点,再让q指向其下一个结点,继续遍历,将单链表中与第二个结点重复的所有结点删除。以此类推,直至指针p也遍历完了整个单链表,则算法结束。

    刚才我们已经删除了一个结点,那么接下来p应该指向下一个结点了:
    在这里插入图片描述
    此时让指针p指向的结点与下一个结点的元素值比较,发现不相等,那么让q直接指向下一个结点即可:q = q -> next
    在这里插入图片描述
    继续让q指向的结点的下一个结点与p指向的结点的元素值比较,发现不相等,此时继续移动q,移动过后q的指针域为NULL,说明遍历结束,此时应该移动指针p。
    在这里插入图片描述
    通过比较发现,下一个结点的元素值与其相等,接下来就删除下一个结点即可:
    在这里插入图片描述
    此时p的指针域也为NULL,算法结束。

    代码如下:

    LinkList DeleteRepeat(LinkList l){
    	LinkList p,q,r;
    	p = l->next;
    	while(p != NULL){
    		q = p;
    		while(q->next != NULL){
    			if(p->data == q->next->data){
    				r = q->next;
    				q = r->next;
    				free(r);	
    			}else{
    				q = q->next;
    			}
    		}
    		p = p->next;
    	}
    	return l;
    }
    

    微信搜索【码视界】或者扫描下方二维码关注我的微信公众号,更多精彩等着你!
    展开全文
  • 数据结构-单链表按值删除

    千次阅读 2017-09-13 17:07:18
    #include #include #define OK 1 #define ERROR 0 using namespace std; typedef struct LNODE { int data;... struct LNODE *next;... cout链表无元素可以... else cout需要删除数值不存在"; } } return 0; }
    #include<iostream>
    #include<stdlib.h>
    #define OK 1
    #define ERROR 0
    using namespace std;
    
    typedef struct LNODE
    {
    	int data;
    	struct LNODE *next;
    }Lnode;
    
    Lnode* Input(int n)
    {
    	Lnode *head,*p,*q;
    	head=p=(Lnode*)malloc(sizeof(Lnode));
    	p->next=NULL;
    	for(int i=0;i<n;i++)
    	{
    		int data;
    		cin>>data;
    		q=(Lnode*)malloc(sizeof(Lnode));
    		q->data=data;
    		q->next=p->next;
    		p->next=q;
    		p=q;
    	}
    	return head;
    }
    
    void Showit(Lnode *p)
    {
    	p=p->next;	
    	while(p!=NULL)
    	{
    		cout<<p->data<<" ";
    		p=p->next;
    	}
    	cout<<endl;
    }
    
    
    int delete_LNode(Lnode *L,int data)
    {
    	if(L->next==NULL) 
    	{
    		cout<<"链表无元素可以删除!"<<endl;
    		return ERROR;
    	}
    	
    	Lnode *cur,*pre;
    	pre=L;
    	cur=L->next;
    	while(cur!=NULL)
    	{
    		if(cur->data==data)
    		{
    			pre->next=cur->next;
    			free(cur);
    			return OK;
    		}
    		pre=cur;
    		cur=cur->next;
    	}
    	return ERROR;
    }
    int main()
    {
    	int n;
    	while(cin>>n)
    	{
    		Lnode *p=Input(n);
    		while(1)
    		{
    			cout<<"输入要删除的数值:";
    			int data;
    			cin>>data;
    			if(delete_LNode(p,data)) Showit(p);
    			else cout<<"需要删除数值不存在"<<endl;
    		}
    	}
    	return 0;
    } 

    展开全文
  • 顺序表的按值删除(算法与数据结构) 顺序表的按值删除(算法与数据结构) PAGE / NUMPAGES 顺序表的按值删除(算法与数据结构) 顺序表的按值删除 #include<iostream> using namespace std; const int MaxSize=200; class...
  • 设计在单链表中删除值相同的多余结点算法。

    万次阅读 多人点赞 2019-01-15 17:21:29
    //s指向要删除结点的前驱 for(q=p->next;q!=NULL; ) { if(q->data==p->data) { s->next=q->next; free(q); q=s->next; } else { s=q; q=q->next; } } } } 二...

    一、具体实现算法如下:

    void DeleteSame(Linklist *L)
    {
    	LNode *p,*q,*s;
    	p = (*L)->next;
    
    	for(p;p!=NULL;p=p->next)
    	{
    		s=p;                    //s指向要删除结点的前驱 
    		for(q=p->next;q!=NULL; )
    		{
    			if(q->data==p->data)
    			{
    				s->next=q->next;
    				free(q);
    				q=s->next;
    			}
    			else
    			{
    				s=q;
    				q=q->next;
    			}
    		}
    	}
    	
    }
    
    

    二、实例程序代码如下所示:

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    
    #define  LEN  10
    
    typedef  int  Elemtype;
    typedef struct LNode{
    	Elemtype data;
    	struct LNode *next;
    }LNode,*Linklist;
    
    void Init_Linklist(Linklist *L)
    {
    	*L=(Linklist)malloc(sizeof(LNode));
    	assert(*L != NULL);
    	(*L)->next=NULL;	
    }
    
    void Create_Linklist(Linklist *L)
    {
    	LNode *p,*q;
    	p = *L;
    	for(int i=0;i<LEN;i++)
    	{
    		q=(Linklist)malloc(sizeof(LNode));
    		assert( q != NULL);
    		scanf("%d",&q->data);
    		p->next=q;
    		p=q;
    	}
    	p->next=NULL;
    }
    
    void DeleteSame(Linklist *L)
    {
    	LNode *p,*q,*s;
    	p = (*L)->next;
    
    	for(p;p!=NULL;p=p->next)
    	{
    		s=p;                    //s指向要删除结点的前驱 
    		for(q=p->next;q!=NULL; )
    		{
    			if(q->data==p->data)
    			{
    				s->next=q->next;
    				free(q);
    				q=s->next;
    			}
    			else
    			{
    				s=q;
    				q=q->next;
    			}
    		}
    	}
    	
    }
    
    void Print_Linklist(Linklist *L)
    {
    	LNode *p;
    	p = *L;
    	while(p->next)
    	{
    		p=p->next;
    		printf("%d ",p->data);
    	}
    	printf("\n");
    }
    
    int main()
    {
    	Linklist L;
    	Init_Linklist(&L);
    	Create_Linklist(&L);
    	printf("初始化链表为:\n");
    	Print_Linklist(&L);
    	DeleteSame(&L);
    	printf("删除后链表为:\n");
    	Print_Linklist(&L);
    	return 0;
    }
    

    运行截图:
    在这里插入图片描述

    展开全文
  • 在单链表中删除值为x的节点

    千次阅读 2021-10-03 14:10:44
    再带头节点的单链表L删除所有为x的节点,并释放其空间,假设为x的节点不唯一,试编写算法以实现上述操作。 二、分析 题目非常简单,只要熟悉单链表的基本操作就可以很快解决这个问题。 三、代码 #...
  • 分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍来!... * 在单链表中删除指定的节点。 * * 思路: * 利用栈或其他容器收集节点。 * * @author Created by LiveE
  • //删除相同的节点 { s -> next = q -> next ; free ( q ) ; q = s -> next ; } else { //p的和q的不相同时的执行步骤 s = q ; q = q -> next ; } } } LNode * ...
  • 在单链表中删除指定的节点。 题目:给定一个链表的头节点head和一个整数num,请实现函数将为num的节点全部删除。 例如1->2->3->4->4->null,输出1->2->3->null. num = 4。 1)第一种...
  • val时,此时要删除q所指向的节点,所以需要一个s指针记录q,防止发生断链。 struct node { int val; node *next; }; void delDuplication(node *head) { for (node *p=head->next; p; p->next) { ...
  • 有一字符型单链表List,假设表无重复,现要删除指定字符x。删除成功时输出新单链表,否则输出“not found”。 输入格式: 有多组数据,每组数据占两行,代表一次删除操作。 每组第一行有两个数,第一个为表长n...
  • 删除单链表中所有为x的数据元素(C语言版)

    千次阅读 多人点赞 2021-04-23 20:21:48
    让两个指针链表从头结点开始移动,如果p指针所指向结点的数据域的与给定的x相等,就要删除 。因为指针r指向该结点的前驱结点,所以我们可以轻松的进行删除操作 void deletex (LinkList* head, int* x) //head...
  • 删除链表等于给定 val 的所有节点。 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5 思路:有两种解题方式,一种是带虚拟头节点的单链表,另一种是不带虚拟节点...
  • 分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!... * 在单链表中删除指定的节点。 * * 思路: * 直接写代码,还是要找到pre节点。 * * @author Created by LiveEveryDay */ public c
  • 带头结点的单链表 L 删除所有为 x 的结点,并释放其空间,假设为 x 的结点不唯一,试编写算法实现上述操作。
  • 删除一个单链表中元素最大结点

    千次阅读 2021-08-20 11:39:33
    #include #include typedef int ElemType; typedef struct LNode { ElemType data;... printf("删除最大结点\n"); delmaxnode(L); printf("L:");DispList(L); DestroyList(L); return 1; }
  • public class node {//前一个节点private node prev;//后一个节点private node next;//private t value;public node() {super();}public node(node prev, node next, t value) {super();this.prev = prev;th...
  • 这里用了两种方式实现: //这一种方式用来三个指针,一个用来遍历的p指针,一个指向p的前驱的pre... } } 删除节点的过程可以分为两步: 找,找到要删除的节点。如何找,通过遍历 删,删除目标节点。如何删,通过前驱
  • 项目任务在单链表增加一个功能erase(x y) 删除所有值在 [x y] 之间的结点。假设链表结点数值类型是整形,要求编程返回删除相应结点后的链表长度和链表元素。输入描述第一行输入链表List的结点元素,元素...
  • 个人代码如下所示,欢迎大佬指正。 #include<stdio.h> #include<stdlib.h>...//删除值为x的结点 void Delete(Link& link, int x) { Node* p = link,*q; while (p->next!=NULL) {
  • DelElem(L,a)的功能是删除以L为首结点指针的单链表中所有为a的结点。同理,DelElem(L->next,a)则删除以L->next为首结点指针的单链表中所有等于x的结点。因此Delete即为删除单链表中特定结点的递归函数...
  • 删除单链表中最大元素(唯一) 用设定四个指针,两个指针做最大的标记,两个指针遍历单链表。因为要删除单链表的元素 必须找到它的前置结点,所以有两个指针是指向最大元素的前置结点。 void ListDelnode(Linknode...
  •  (2) 删除链表的指定:  步骤一: 排除特殊情况:头结点等于需要删除值data,则先直接删除头部节点;  步骤二:  使用快慢指针p, q;  if p->val == data  q->next = p->next;  删除p...
  • 单链表查找最大删除

    千次阅读 2020-10-05 18:54:20
    试编写带头结点的单链表中删除一个最大结点的高效算法。 代码实现: // 带头节点的单链表中删除一个最大结点 #include <stdio.h> #include <stdlib.h> using namespace std; // 单链表结构 ...
  • 在单链表中删除指定的节点

    千次阅读 2017-11-06 16:44:33
    //在单链表中删除指定的节点 public class delNode{ //节点的定义 public static class Node{ int value; Node next; public Node(int data) { this.value=data; } } //一、变量法存储 publi
  • 带头结点的单链表L删除所有为x的节点,并释放其内存空间,假设为x的节点不唯一,试编写算法实现上述代码。 问题分析 使用pre指针指向头节点,用pre->next逐个扫描,如果pre->next节点的为x,pre...
  • 删除单链表的最大

    千次阅读 2017-12-02 12:33:48
    int fine_max() { int max=head.next->data; node* p=head.next->next; while(p) { if(maxdata) max=p->data; p=p->next; } return max; } void erase_data(c
  • 删除单链表中所有为x的结点

    千次阅读 2019-11-15 20:42:11
    LinkList Delete_SameX(LinkList L,int x){//删除单链表中所有为x的元素 LinkList p = L->next;//删除p LinkList pre = L; LinkList q; while(p!=NULL){ if(p->data == x){ q = p; pre->next = q-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,375
精华内容 25,350
关键字:

在单链表中按值删除