有序链表的合并,但实际问题出现在创建链表或者是输出链表上

我把递增的结构体数组赋值给空链表,不知道是赋值的原因还是输出的原因,在合并两个链表之前输出第一个链表竟然是递减的
结构体数组定义如下:

typedef struct student
{
    char name[10];
    int grade;
}ss;

typedef struct node  
{
    ss data;
    struct node *next;     //指向下一个元素的指针
}Sqlist;

初始化,创建,输出链表代码如下:

void Initlist(Sqlist *&L)
{
    L=(Sqlist *)malloc(sizeof(Sqlist));
    L->next=NULL;
}

void Createlist(Sqlist *&L,student a[],int n)    //利用头插法建立链表
{
    Sqlist *s;
    for(int i=0;i<n;i++)
    {
        s=(Sqlist *)malloc(sizeof(Sqlist));       //循环开辟新结点
        s->data=a[i];
        s->next=L->next;                           //首元结点是第二个结点
        L->next=s;
    }
}

void Displist(Sqlist *L)                   
{
    Sqlist *p=L->next;  //指向第一个首元结点
    int i=1;
    while(p!=NULL)
    {
        printf("%d\t%s\t%d\n",i,p->data.name,p->data.grade);    //输出的是乱码的原因是写成了L->data.name
        p=p->next;
        i++;
    }
}

主函数代码如下:

int main()
{
    int m,n;
    ss a[3]={{"xxx",79},
             {"yyy",88},
             {"zzz",90}};
    ss b[3]={{"lll",89},
             {"jjj",90},
             {"uuu",99}};
    Sqlist *L1,*L2,*L3;
    Initlist(L1);
    Initlist(L2);
    Initlist(L3);
    m=sizeof(a)/sizeof(ss);
    n=sizeof(b)/sizeof(ss);
    Createlist(L1,a,m);
    Displist(L1);
    /*Createlist(L2,b,n);
    Linklist(L1,L2,L3);
    Displist(L1);*/
}

输出L1的结果为:

img


什么情况,竟然成了递减的了?有哪位可以帮助我解决一下这个问题,万分感谢呐~

s->data=a[i];
s->next=L->next;       //首元结点是第二个结点
L->next=s;

这里就是把新节点添加到链表前面(每次放L后面),所以变成递减了。可增加一个尾指针T,初始为T=L; 增加节点时T->next=s; T=s; 这样就加最后了,保持递增

【以下回答由 GPT 生成】

问题所在是在Createlist函数中的循环中,每次都是将新节点插入到链表头部,导致输出链表的顺序与数组的顺序相反。

为了创建一个有序链表,可以采用插入排序的方法来插入新的节点。具体步骤如下:

  1. 修改Createlist函数如下:
void Createlist(Sqlist *&L, student a[], int n)
{
    for(int i=0; i<n; i++)
    {
        Sqlist *s = (Sqlist *)malloc(sizeof(Sqlist));
        s->data = a[i];

        Sqlist *pre = L;
        Sqlist *curr = L->next;

        while(curr != NULL && curr->data.grade < s->data.grade) {
            pre = curr;
            curr = curr->next;
        }

        s->next = curr;
        pre->next = s;
    }
}
  1. main函数中调用修改后的Createlist函数来创建有序链表:
Createlist(L1, a, m);
Createlist(L2, b, n);
  1. Displist函数中不需要做任何修改。

  2. 编写完整的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct student
{
    char name[10];
    int grade;
} ss;

typedef struct node  
{
    ss data;
    struct node *next;
} Sqlist;

void Initlist(Sqlist *&L)
{
    L=(Sqlist *)malloc(sizeof(Sqlist));
    L->next=NULL;
}

void Createlist(Sqlist *&L, student a[], int n)
{
    for(int i=0; i<n; i++)
    {
        Sqlist *s = (Sqlist *)malloc(sizeof(Sqlist));
        s->data = a[i];

        Sqlist *pre = L;
        Sqlist *curr = L->next;

        while(curr != NULL && curr->data.grade < s->data.grade) {
            pre = curr;
            curr = curr->next;
        }

        s->next = curr;
        pre->next = s;
    }
}

void Displist(Sqlist *L)                   
{
    Sqlist *p=L->next;
    int i=1;
    while(p!=NULL)
    {
        printf("%d\t%s\t%d\n",i,p->data.name,p->data.grade);
        p=p->next;
        i++;
    }
}

int main()
{
    int m, n;
    ss a[3] = {{"xxx",79},
               {"yyy",88},
               {"zzz",90}};
    ss b[3] = {{"lll",89},
               {"jjj",90},
               {"uuu",99}};
    Sqlist *L1, *L2, *L3;
    Initlist(L1);
    Initlist(L2);
    Initlist(L3);
    m=sizeof(a)/sizeof(ss);
    n=sizeof(b)/sizeof(ss);
    Createlist(L1, a, m);
    Createlist(L2, b, n);
    Displist(L1);
    Displist(L2);

    return 0;
}

修改后的代码会根据学生成绩的大小,将新节点插入到相应的位置,从而创建一个有序链表。运行程序后,Displist函数会按递增顺序输出链表的节点。



【相关推荐】



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