我把递增的结构体数组赋值给空链表,不知道是赋值的原因还是输出的原因,在合并两个链表之前输出第一个链表竟然是递减的
结构体数组定义如下:
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的结果为:
s->data=a[i];
s->next=L->next; //首元结点是第二个结点
L->next=s;
这里就是把新节点添加到链表前面(每次放L后面),所以变成递减了。可增加一个尾指针T,初始为T=L; 增加节点时T->next=s; T=s; 这样就加最后了,保持递增
【以下回答由 GPT 生成】
问题所在是在Createlist
函数中的循环中,每次都是将新节点插入到链表头部,导致输出链表的顺序与数组的顺序相反。
为了创建一个有序链表,可以采用插入排序的方法来插入新的节点。具体步骤如下:
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;
}
}
main
函数中调用修改后的Createlist
函数来创建有序链表:Createlist(L1, a, m);
Createlist(L2, b, n);
在Displist
函数中不需要做任何修改。
编写完整的代码如下:
#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
函数会按递增顺序输出链表的节点。
【相关推荐】