谭浩强C语言程序设计9.3链表


#include<stdio.h>
#include<stdlib.h>
struct node {
    long num;
    float score;
    struct node* next;
} node;
void creat(){
    node* head=(node*)malloc(sizeof(node));
    head->num = 0;
    head->score = 0;
    node* p = head;
    do {
        node* newNode = (node*)malloc(sizeof(node));
        scanf("%ld,%f", newNode->num, newNode->score);
        newNode->next = NULL;
        p->next = newNpde;
        p = p->next;
    } while (newNode->num);
    return head;
}
void printNode(node* head) {
    node* p = head;
    while (p != NULL) {
        printf("%ld%f", p->num, p->score);
        p = p->next;
    }
}
void del(node* head){
    int val;
    scanf("%ld", val);
    node* p = head->next;
    node* prev = head;
    while (p != NULL) {
        if (p->num = val) {
            prev->next = p->next;
            free(p);
            break;
        }
        else {
            prev = p;
            p = p - >next;
        }
    }
}
void insert(node* head){
    node* newNode = (node*)malloc(sizeof(node));
    newNode->next = NULL;
    int n;
    scanf("%ld%f%d", &newNode->num, &newNode->score,&n);
    p = head;
    for (int i = 1; i <= n, i++) {
        p = p->next;
        if (i ==n)
        {
            newNode->next = p->next;
            p->next = newNode;
        }
    }
}
int main()
{   creat(head);
    del(head);
    insert(head);
    printfNode(head);
    return 0;
}

我快要废了,谁来帮帮我


10101,90.0

10102,88.5

10103,95.0

10104,93.5

10105,88.0(输入数据)

0(输入结束)

10101(删除数据)

10106,98.0(插入数据)

2(插入位置)

代码我给你调通了,很多都是语法问题,这个希望你再精进一下你的语言能力,先上结果

img

首先是你的creat函数,你是一个void类型的函数怎么可以有返回值呢,这种当然你用void也可以,但是你必须往creat函数里面传入一个头节点,不然你在这个函数里面对头节点进行的操作都保存不下来啊,函数结束你创建的东西都找不到了,再就是你像我一样,把你的create函数改成一个有返回值类型的,返回一个node指针类型,当然你定义结构体的时候你要用到typedef,不然你的node只是一个结构体的成员,你是不能用他来表示结构体的
还有一个是do-while语句里的scanf,你在输入值的时候就必须告诉程序你这个值要输入到哪里,所以必须加取地址符,不然就会发生错误
还有do-while语句的判断条件,实际上我也比较好奇,但是我现在可能无法解释,就是while的判断条件不能在do-while里面定义,不然电脑发现不了这个变量,可能电脑在执行的时候不管你do-while里面是什么样子,但是这个while判断条件要单独处理吧,你这个时候把你的条件变量定义在do-while里面计算机就发现不了你定义过这个变量,所以我用while给你改了一个下面是我修改好的代码,供你参考

#include<stdio.h>
#include<stdlib.h>
typedef struct node {
    long num;
    float score;
    struct node* next;
} node;
node* creat(){
    node* head=(node*)malloc(sizeof(node));
    head->num = 0;
    head->score = 0;
    node* p = head;
    while(1)
    {
        node* newNode = (node*)malloc(sizeof(node));
        scanf("%ld%f", &newNode->num, &newNode->score);
        if(newNode->num == 0)
        {
            break;
        }
        newNode->next = NULL;
        p->next = newNode;
        p = p->next;
    }
//    do {
//        node* newNode = (node*)malloc(sizeof(node));
//        scanf("%ld,%f", &newNode->num, &newNode->score);
//        newNode->next = NULL;
//        p->next = newNode;
//        p = p->next;
//    }while(newNode->num);
    return head;
}
void printNode(node* head) {
    node* p = head->next;
    while (p != NULL) {
        printf("\n%ld %f\n", p->num, p->score);
        p = p->next;
    }
}
void del(node* head){
    long val;
    scanf("%ld", &val);
    node* p = head->next;
    node* prev = head;
    while (p != NULL) {
        if (p->num == val) {
            prev->next = p->next;
            free(p);
            break;
        }
        else {
            prev = p;
            p = p ->next;
        }
    }
}
void insert(node* head){
    node* newNode = (node*)malloc(sizeof(node));
    newNode->next = NULL;
    int n;
    scanf("%ld%f%d", &newNode->num, &newNode->score,&n);
    node* p = head;
    for (int i = 1; i <= n; i++) {
        p = p->next;
        if (i ==n)
        {
            newNode->next = p->next;
            p->next = newNode;
            break;
        }
    }
}
int main()
{
    node* head;
    head = creat();
    del(head);
    insert(head);
    printNode(head);
    return 0;
}

你直接说遇到啥问题了,我博客有一篇C++写的带头节点的单向链表。