在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C/ c語言問題 鏈表

c語言問題 鏈表

問題描述】建立一個鏈表,每個結點包括:姓名、年齡。輸入一個年齡,如果鏈表中的結點所包含的年齡等于此年齡,則將此結點刪去。

【輸入形式】首先待輸入數(shù)據(jù)個數(shù),然后輸入每個結點信息;輸入完成后,輸入待刪除結點的年齡信息。
【輸出形式】若在鏈表中找到待刪除數(shù)據(jù)則刪除該結點并顯示刪除后的鏈表,若沒有找到數(shù)據(jù)則輸出“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函數(shù)那邊,修改后如下:

struct stu * select(struct stu *head, int n, int m)   // 函數(shù)返回類型注意一下,還有第一個參數(shù)類型
{
    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 函數(shù)中調用
...
head = select(head,n, m);
...

你的select函數(shù)寫的有點復雜,可以看看我的:

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 中調用方式不變
2017年11月12日 11:59