问题描述】建立一个链表,每个结点包括:姓名、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
【输入形式】首先待输入数据个数,然后输入每个结点信息;输入完成后,输入待删除结点的年龄信息。
【输出形式】若在链表中找到待删除数据则删除该结点并显示删除后的链表,若没有找到数据则输出“no data”。
【样例输入】
4
mu 20
yu 21
qu 19
ku 20
20
【样例输出】
yu 21
qu 19
【样例输入】
4
mu 20
yu 21
qu 19
ku 20
9
【样例输出】
no data
我的代码
include<stdio.h>
include<stdlib.h>
int flag = 0;
struct stu {
char name[12];
int age;
struct stu *next;
};
struct stu *creat(int n)
{
struct stu*head = NULL;
struct stu *p1, *p2;
p1 = p2 = new stu;
scanf("%s %d", p1->name, &p1->age);
for (int i = 1; i < n; i++)
{
if (i == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = new stu;
scanf("%s %d", p1->name, &p1->age);
}
p2->next = p1;
p2 = p1;
p2->next = NULL;
return head;
}
struct stu select(struct stuhead, int n,int m)
{
struct stu *p1 = head,*p2=p1,*temp=p1;
for (int i = 0;; i++) {
if (head->age == m) {
free(head);
head = p1->next;
p1 = head;
p2 = head;
flag = 1;
}
else if (p1->next != NULL) {
p2 = p1;
p1 = p1->next;
if (p1->age == m) {
p2->next = p1->next;
temp = p1;
p1 = p1->next;
free(temp);
flag = 1;
}
}
else if(p1->next==NULL&&p1->age==m) {
p2->next = NULL;
free(p1);
p1 = p2;
flag = 1;
}
if (p1->next == NULL && p1->age != m)
break;
}
return head;
}
int main()
{
struct stu*head,*p;
int m, n;
scanf("%d", &n);
head=creat(n);
scanf("%d", &m);
select(head, n, m);
if (flag == 0) {
printf("no data");
}
else {
p = head;
do {
printf("%s %d", p->name, p->age);
p = p->next;
} while (p != NULL);
}
system("pause");
return 0;
}
请各位帮我看看是哪里出错了呢 NO DATA的情况下能输出 其他情况则不能 编译器提示P1冲突 是咋回事?感谢各位!!!!
首先,提问时麻烦把代码格式调一下,太不舒服了。
==========================================
问题主要是你的
select
函数那边,修改后如下:你的
select
函数写的有点复杂,可以看看我的: