关于#c++#的问题:还是用循环找到最大值(panduan函数用来保证相同一个结点只算一次),直到数组元素个数等于链表长度,最后用数组里的地址依次打印

麻烦帮忙看看,万分感谢。
用c语言写的链表,主要是排名那个函数不知哪里出了问题,排不出正确结果。

下面是源代码:
#include
#include
#include
typedef struct n{
    char number[15];
    char name[10];
    int a;
    int b;
    int c;
    struct n* next;
}bin;
int luru(bin *q){//q是头节点。 
    printf("您需要录入几个学生:");
    int a;
    scanf("%d",&a);
    while(a)
        {
        bin *s = (bin *)malloc(sizeof(bin));
        printf("请输入学号(小于15个字节):");
        scanf("%s",&s->number);
        printf("请输入学生姓名(小于10个字节):");
        scanf("%s",&s->name);
        printf("请输入第一门成绩:");
        scanf("%d",&s->a);
        printf("请输入第二门成绩:");
        scanf("%d",&s->b);
        printf("请输入第三门成绩:");
        scanf("%d",&s->c); 
        s->next = q->next;
        q->next = s;
        printf("录入成功。\n");
        a--;
        }
    return 1;
}
int panduan(bin *z,bin *a[],int n){//数组里出现过了的地址,就不再存放; 
    for(int i = 0;i <= n;i++)
        {
        if(z == a[i])
            return 0;
        }
    return 1;
}
int paiming(bin *q){//对链表按总成绩排名。 
    if(q->next == 0)
        {
        printf("没有学生的信息。\n");
        return 0;
        }     
    bin *p = q->next,*z;
    int i = 0,max = 0,n = -1;
    while(p != 0)
        {
        i++;
        p = p->next; 
        }
    bin *a[i];//用一个数组,总成绩从大到小的存放链表地址。 
    while(n < i)
        {
        p = q->next;
        while(p != 0)
            {
            if((p->a + p->b + p->c) >= max&&panduan(z,a,n))//如果重复地址就不进入。 
                {
                max = p->a + p->b + p->c;
                z = p;
                }
            p = p->next;
            }
        n++;
        a[n] = z;
        }
    for(n = 0;n < i;n++)
        {
         printf("学生学号:%s    学生姓名:%s\n",a[0]->number,a[1]->name);
        }
    return 1;
}
int main()
{
    bin *q = (bin *)malloc(sizeof(bin));
    q->next = 0;
    luru(q);
    paiming(q);
}

我的思路是:
我用循环,第一次找出链表中最大的总成绩,并将它的地址放进数组下表0的位置。从第二次开始,还是用循环找到最大值(panduan函数用来保证相同一个结点只算一次),一直循环,直到数组元素个数等于链表长度,就结束循环,最后用数组里的地址依次打印。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7732380
  • 以下回答来自chatgpt:

    我不确定你的问题是关于循环找到链表中的最大值还是关于合并两个有序链表,所以我会分别回答这两个问题。

    1. 如何通过循环找到链表中的最大值并打印地址?

    我们可以通过遍历链表并持续更新最大值的方式来找到链表中的最大值。具体来说,我们可以使用一个变量 maxVal 来记录最大值,并使用一个指针 maxNode 来记录最大值所在的节点。我们从链表的头节点开始遍历,如果当前节点的值比 maxVal 大,则更新 maxVal 和 maxNode。遍历完链表后,maxNode 就是最大值所在的节点,我们只需要打印这个节点的地址即可。

    以下是 C++ 的代码实现:

    struct ListNode {
        int val;
        ListNode* next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    
    void printMaxNode(ListNode* head) {
        ListNode* maxNode = head;
        int maxVal = head->val;
        ListNode* p = head->next;
        while (p != NULL) {
            if (p->val > maxVal) {
                maxVal = p->val;
                maxNode = p;
            }
            p = p->next;
        }
        cout << "The maximum value is " << maxVal << endl;
        cout << "The address of the node containing the maximum value is " << maxNode << endl;
    }
    
    1. 如何合并两个递增的有序链表?

    我们可以遍历这两个链表,并将它们的元素逐一比较,将较小的值插入到结果链表中。具体来说,我们可以维护三个指针:pa、pb 和 pc,分别指向两个原始链表和合并后的结果链表。我们从两个原始链表的头节点开始,逐一将它们的元素比较,将较小的值插入到结果链表中,并持续更新指针 pa、pb 和 pc。当其中一个链表遍历完后,我们只需要将另一个链表的剩余部分插入到结果链表中即可。

    以下是 C++ 的代码实现:

    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* pa = l1;
        ListNode* pb = l2;
        ListNode* pc = new ListNode(0);
        ListNode* result = pc;
        while (pa != NULL && pb != NULL) {
            if (pa->val <= pb->val) {
                pc->next = pa;
                pa = pa->next;
            } else {
                pc->next = pb;
                pb = pb->next;
            }
            pc = pc->next;
        }
        pc->next = (pa == NULL) ? pb : pa;
        return result->next;
    }
    

    注意,我们需要创建一个头节点作为结果链表的起点,最终返回 result->next 即可。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^