c语言问题 链表

问题描述】建立一个链表,每个结点包括:姓名、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。

【输入形式】首先待输入数据个数,然后输入每个结点信息;输入完成后,输入待删除结点的年龄信息。
【输出形式】若在链表中找到待删除数据则删除该结点并显示删除后的链表,若没有找到数据则输出“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冲突 是咋回事?感谢各位!!!!

阅读 1.8k
1 个回答

首先,提问时麻烦把代码格式调一下,太不舒服了。

==========================================

问题主要是你的select函数那边,修改后如下:

struct stu * select(struct stu *head, 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 == NULL)        // 这里修改了
            break;
    }
    return head;
}

// main 函数中调用
...
head = select(head,n, m);
...

你的select函数写的有点复杂,可以看看我的:

struct stu * select(struct stu *head, int n, int m)
{
    struct stu *p1 = head;
    struct stu *p2 = p1;
    while(p1) {
        if(p1->age == m) {
            flag = 1;
            if(p1 == head) { // 第一个结点
                head = p1->next;
                delete p1;
                p1 = p2 = head;
            } else {    // 不是第一个结点
                p2->next = p1->next;
                delete p1;
                p1 = p2->next;
            }
        } else {
            if(p1 != head ) {
                p2 = p1;
            }
            p1 = p1->next;
        }
    }
    return head;
}

// main 中调用方式不变
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进