欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

删除链表中指定的元素

程序员文章站 2022-03-22 16:33:44
...

本段代码实现了

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;
}