删除链表中指定的元素

本段代码实现了

1 新建链表
2 输出链表
3 删除链表中的指定元素
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include "test1.h"

/*
创建一个结构体
*/
typedef struct Node {
	int data;//数据
	struct Node *next;//下一个结点的指针
}Node;
int count = 0;//记录链表的长度

Node *InitList() {
	Node *head;//定义头指针
	Node *q, *p;//定义两个结构体指针用于后面迭代
	head = (Node *)malloc(sizeof(Node));
	q = head;
	while (1)
	{
		count++;
		p = (Node *)malloc(sizeof(Node));
		printf("请输入第%d个数: (如需结束输入0):   ", count);
		scanf_s("%d", &p->data);
		if (p->data == 0) {
			return head;
		}
		//在迭代插入新的节点的过程中一直使P指向新的节点,q指向当前节点
		p->next = NULL;
		q->next = p;
		q = p;
	}
}

void showList(Node *m) {
	Node *p;
	p = m->next;//让p指针指向第一个节点
	while (p!=NULL)
	{	
		//注意头指针的数据是不需要输出的
		printf("%d\n", p->data);
		p = p->next;
	}
}
void DeleteListItem(Node *n,int x) {
	Node *p,*q,*pre; //p为循环指针,q指向需要删除的指针, pre始终为当前指针的前一位,类似双链表
	p = n->next;//让p指向第一个节点,跳过头节点
	pre = n;
	while (p!=NULL)
	{
		if (p->data==x)
		{	
			printf("找到要删除的数据%d---%d\n",p->data,x);
			q = p;//q指针指向需要删除的指针
			p = p->next;//循环指针跳到下一个位置
			pre->next = p;//此时,可以理解为前驱节点跳过要删除的点,next指向P
			free(q);//释放内存
			count--;
		}else
		{
			pre = p;
			p = p->next;
		}
	}
}

int main() {
	//创建好了一个链表
	Node *m = InitList();
	//输出链表中的数据信息
	showList(m);
	printf("请输入需要删除的元素: ");
	int d;
	scanf_s("%d", &d);
	//删除链表中指定元素
	DeleteListItem(m, d);
	//删除完再输出数据
	printf("删除了指定元素后的列表:\n", d);
	printf("链表总长度为:%d\n", count);
	showList(m);
	system("pause");
	return 0;
}
  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值