题目描述:
KiKi学习了结构体和指针,他了解了结构体类型可以定义包含多个不同类型成员,而指针本质是内存地址,是引用数据的另外一种方式。现在他想将多个输入的数据通过结构体和指针的方式连接在一起,形成一个单向链表,即:每个结点是结构体类型,包括整型数据成员(data)和结构体指针类型成员(next),每个结点的指针部分指向下一个输入的结点。具体建立过程如下:先输入n个整数,按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。输出删除后的单链表信息。
输入描述:
包括三行: 第一行输入数据个数n (3≤n≤100); 第二行依次输入n个整数,用空格分隔; 第三行输入欲删除数据m。
输出描述:
包括两行: 第一行输出完成删除后的单链表长度;
第二行依次输出完成删除后的单链表数据。
#include <stdio.h>
//链表结点的定义方式
struct Node
{
int data; //数据域
struct Node* next; //指针域
};
int main()
{
struct Node* list = NULL; //指向链表的指针
struct Node* tail = NULL; //指向链表尾巴的指针
int n = 0;
scanf("%d",&n);
int i = 0;
int m = 0;//每次录入的整数
//接受n个数字,并尾插到链表中
for(i=0; i<n; i++)
{
scanf("%d",&m);
struct Node* pn =(struct Node*) malloc(sizeof(struct Node));
pn->data=m;
pn->next=NULL;
//插入第一个元素
if(list == NULL) //头部覆盖
{
list = pn;
tail = pn;
}
else //尾部覆盖
{
tail -> next = pn;
tail = pn;
}
}
//获取要删除的元素
int del = 0;
scanf("%d",&del);
//删除指定的元素
struct Node* cur = list;
struct Node* prev = NULL; // 记录的是要删除元素的前一个元素的地址
while(cur)
{
//找到了要删除的元素
if(cur->data == del)
{
//删除
//删除的如果是第一个结点
struct Node* pd = cur;//指向要删除的元素
if(cur == list)
{
list = list->next;
cur = list;
}
else//如果删除的不是第一个结点
{
prev->next = cur->next;
cur = prev->next;
}
free(pd);
n--;
}
else
{
prev = cur;
cur = cur->next;
}
}
//输出
printf("%d\n",n);
//使用while循环进行遍历单链表
cur = list;
while(cur)
{
printf("%d ",cur->data);
cur = cur->next;
}
//释放单链表
cur =list;
struct Node* enddel = NULL;
while(cur)
{
enddel = cur;
cur = cur->next;
free(enddel);
}
list = NULL;//将list置为空指针
return 0;
}