删除链表中指定的元素
程序员文章站
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;
}