`
wudikua123
  • 浏览: 63276 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单链表删除一个节点

 
阅读更多
有头结点的情况,附加一个逆置
#include <stdio.h>
#include <malloc.h>
#define null 0
typedef struct Node{
	int value;
    struct Node* next;
};

//尾插 
void create(struct Node* head){
	//p是工作指针 
	struct Node* p = head;
	int i;
	for(i = 1; i<=1; i++){
	
		p->next = malloc(sizeof(struct Node));
		p->next->value = i;
		p->next->next = null;
		p = p->next;			
		
	}	
}

void print(struct Node* head){
	struct Node* p = head->next;
	while(p){
		printf("%d\t",p->value);
		p = p->next;
	}
	printf("\n");
	
}

int delete(struct Node* x,struct Node* head){
	struct Node* p = head->next;
	struct Node* pre = head;
	
	while(p){
		if(p->value == x->value){
			pre->next = p->next;
			free(p);
			return 1;
		}else{
			pre = p;
		}
		
		p = p->next;
	}
	
	return 0;
}

void rev(struct Node* head){
	if(head->next != null){
		struct Node* p = head->next->next;
		struct Node* temp;
		struct Node* pre = head->next;
		pre->next = null;
		while(p){
			temp = p;
			p = p->next;
			temp->next = pre;
			pre = temp;
		}
		head->next = pre;	
	}	
}

int main(int argc,char *argv[]){
	struct Node* head = malloc(sizeof(struct Node));
	head->value = -1;
	create(head);
	print(head);
	
	
	struct Node* x = malloc(sizeof(struct Node));
	x->value = 1;
	delete(x,head);
	print(head);
	
	
	rev(head);
	print(head);
	
	return 0;	
}



没有头结点的情况,还是有些不同的地方要注意的。
#include <stdio.h>
#include <malloc.h>
#define null 0
struct Node{
	int value;
	struct Node* next;
};

//头插 
struct Node* create(){
	struct Node* head = null;
	int i;
	for(i = 1; i<=10; i++){
		if(head == null){
			head = malloc(sizeof(struct Node));
			head->value = i;
			head->next = null;	
		}else{
			struct Node* p = malloc(sizeof(struct Node));	
			p->value = i;
		    p->next	= head->next;				
			head->next = p;
		}
	}
	return head;	
}

void print(struct Node* head){
	struct Node* p = head;
	while(p){
		printf("%d\t",p->value);
		p = p->next;
	}
	printf("\n");
	
}

//注意这里想改变head指针的指向 必须传head的引用 所以是 Node** 
int delete(struct Node* x,struct Node** head){
	struct Node* p = head;
	struct Node* pre = head;
	//被删除节点是第一个的时候要特殊处理 
	if((*head)->value == x->value	){
			*head = (*head)->next;
			free(p);
			return 1;
	}
	while(p){
		if(p->value == x->value){
			pre->next = p->next;
			free(p);
			return 1;	
		}else{
			pre = p;
		}
		
		p = p->next;
	}
	
	return 0;
}

int main(int argc,char *argv[]){
	
	struct Node* head = create();
	print(head);
	
	struct Node* x = malloc(sizeof(struct Node));
	x->value = 1;
	delete(x,&head);
	print(head);
	
	return 0;	
}

分享到:
评论

相关推荐

    单链表之头部插入节点.pdf

    单链表是一种基础的数据结构,常用于存储线性序列数据,其每个节点包含数据和一个指向下一个节点的指针。在单链表中,头部插入节点是常见的操作之一,尤其在面试和笔试中常被用来考察对数据结构的理解和编程能力。 ...

    从单链表中删除节点数值作为函数参数C和指针第十二章编程练习5

    在本编程练习中,我们的目标是编写一个函数,该函数接受单链表的头指针和一个待删除的节点值作为参数,然后从链表中删除所有具有该值的节点。这个功能对于链表的维护和数据清理至关重要。 首先,我们需要理解链表的...

    删除单链表的倒数第n个节点.cpp

    在本文中,我们将深入探讨如何实现C++编程中删除单链表倒数第n个节点的问题,这是一个典型的链表操作,对于理解和掌握数据结构中的链表至关重要。首先,我们需要了解单链表的基本概念,它的存储结构以及如何进行基本...

    03016202万玥汝第一次实验报告_单链表逆转_单链表后插入新节点_删除结点_查找结点_

    单链表是数据结构中的一种基础元素,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在本实验中,我们探讨了单链表的几个关键操作:逆转链表、在指定位置后插入新节点、删除特定节点以及查找节点。 ...

    从单链表中删除节点指向欲删除的结点的指针作为函数参数C和指针第十二章编程练习5

    在本编程练习中,我们关注的是如何从单链表中删除一个特定的节点,而这个节点的指针作为函数参数传递。这涉及到对链表的操作,包括遍历、查找以及修改链表结构。下面我们将详细探讨这一主题。 首先,让我们了解...

    循环单链表中值为X节点删除方法

    内容概要:本文档详细介绍了如何在一个已知循环单链表中查找指定值x,并完成对含有这个值得节点的删除处理。具体来讲,首先确认待处理列表非空状态,再定义用于存储该待删除项及其前一元素的对象。接下来,利用一个...

    C语言 学生成绩管理(单链表,排序,节点增加删除等).rar

    本项目旨在通过C语言实现一个简单的学生成绩管理系统,涵盖了单链表、排序以及节点的增加和删除等核心概念。下面我们将详细探讨这些知识点。 一、单链表 单链表是一种线性数据结构,由一系列节点组成,每个节点...

    单链表的建立、插入节点、删除节点、逆序、查找等等

    单链表的建立、插入节点、删除节点、逆序、查找等等,希望了可以给你们带来帮助

    C++ 实现带头节点的单链表

    本篇文章主要介绍如何使用C++来实现一个带有头节点的单链表。单链表是一种基本的数据结构,在计算机科学中有着广泛的应用,例如用于存储有序的数据集合或作为其他更复杂数据结构(如哈希表)的基础组件。 #### 类...

    对单链表删除前驱结点

    对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点

    数据结构单链表实例一个简单的小程序

    数据结构中的单链表是一种基础且重要的数据组织方式,它由一系列节点组成,每个节点包含数据元素和指向下一个节点的指针。在这个“数据结构单链表实例一个简单的小程序”中,我们可以推测作者实现了一个用C语言编写...

    单链表的基本操作及实现

    单链表由一系列节点组成,每个节点包含数据元素以及指向下一个节点的引用,最后一个节点的引用通常为null,标志着链表的结束。 **一、单链表的结构** 1. **节点定义**:在单链表中,每个数据元素被称为节点。一个...

    单向链表结点的逐个删除-C语言教程

    通过一个循环,不断地删除`p`所指向的当前节点,并让`p`指向下一个节点。当`p-&gt;next`为NULL时,说明已经到达链表尾部,删除操作完成。示例代码如下: ```c void remove(node *head) { int i = 0; // 统计删除结点...

    一次遍历删除倒数第n个节点

    一次遍历单链表删除倒数第n个节点的问题,跟删除某个节点的前一个节点是一个思路

    创建包含学号、姓名节点的单链表

    该函数会创建一个空链表,然后插入几个节点,接着删除一个节点,最后打印出链表的所有节点信息。 本文详细介绍了如何创建包含学号、姓名节点的单链表,并实现插入和删除节点的操作。该单链表使用C++语言实现,节点...

    一个简单的单链表作业

    删除节点需要找到待删除节点,然后更新其前一个节点的指针以跳过待删除节点。如果要删除的是头节点,需要创建一个新的头节点指向原头节点的下一个节点。 4. **查找操作**: 在单链表中查找特定值的节点,通常从头...

    删除单链表中值相同的多余结点的算法

    4. **删除节点**:如果发现`q-&gt;data`与`p-&gt;data`相同,则更新`q`前面节点的`next`指针使其跳过`q`,即`s-&gt;next = q-&gt;next`,然后释放`q`所占的内存,并更新`q`指向下一个节点。 5. **循环条件**:当`p`到达链表尾部...

    线性单链表的演示详细操作

    - 删除指定位置的节点:找到要删除节点的前一个节点,更新其指针域指向要删除节点的下一个节点。 3. 查找节点: - 遍历链表直到找到目标节点或到达链表末尾。时间复杂度为O(n),其中n为链表长度。 4. 遍历链表:...

    python实现单链表中删除倒数第K个节点的方法

    删除单链表中的特定节点,尤其是倒数第K个节点,是一个常见的操作,有助于理解链表的基本操作。下面将详细讨论如何在Python中实现这个功能。 首先,我们需要创建一个单链表类`LinkedListAlgorithms`,它包含一些...

    单链表的创建、插入、删除

    删除单链表中的节点需要找到待删除节点的前一个节点,并更新其指针使其指向待删除节点的后一个节点。给定代码中实现了一个删除函数`delete_lb`,该函数同样接受三个参数:链表头结点`L`、删除位置`i`和返回被删除...

Global site tag (gtag.js) - Google Analytics