C语言动态链表转置程序有误

链表转置后没有打印结果,while函数里也没有一个打印结果,为什么没进循环呢?求改错。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct student
{
    int data;
    struct student *next;
}a;
struct student *p,*q,*head,*t,*l,*m;
int main()
{
    int i,n,c=0;
    printf("请输入n:\n");
    scanf("%d",&n);
    l=head=q=&a;
    printf("\n");
    q->next=NULL;
    printf("正项链表:\n");
    printf("请输入%d个同学的成绩:\n",n);
    for(i=0;i<n;i++)
    {
        p = (struct student*)malloc(sizeof(struct student));
        c++;
        if(c==1) head=l=p;
        scanf("%d",&p->data);
        if(p->data == -1)
        {
            printf("输入结束\n");
            p -> next = NULL;
            break;
        }
        q->next = p;
        q = q->next;
    }
    p->next=NULL;
    printf("\n");
    printf("打印数据:\n");
    for(i=0;head!=NULL;i++)
    {
        printf("%d\n", head->data);
        head = head->next;
    }
    printf("转置为逆向链表为:\n");   
    t= l->next;
    m->next =NULL;
    while(l!=NULL)
    {  
        l->next= m->next;
        m->next = l;
        l = t;
        t = t->next;
        printf("%d\n",l->data);
    }
    for(i=0;i<n;i++)
    {
        printf("%d\n",m->data);
        m=m->next;
    }
    return 0;
}
 

你稍微画一下链表,你就晓得问题出在那了。

供参考:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct student{
    int data;
    struct student* next;
}a;
struct student* p, * q, * head, * t, * l, * m;
int main()
{
    int i, n, c = 0;
    printf("请输入n:\n");
    scanf("%d", &n);
    l = head = q = &a;
    printf("\n");
    q->next = NULL;
    printf("正项链表:\n");
    printf("请输入%d个同学的成绩:\n", n);
    for (i = 0; i < n; i++)
    {
        p = (struct student*)malloc(sizeof(struct student));
        p->next = NULL;
        scanf("%d", &p->data);
        if (p->data == -1)
        {
            free(p);          //修改   
            printf("输入结束\n");
            break;
        }
        c++;           //修改  
        if (c == 1)
            head = l = p;
        else          //修改  
            q->next = p;
        q = p;        //q = q->next;
    }
                      //p->next = NULL;
    printf("\n");
    printf("打印数据:\n");
    for (i = 0; head != NULL; i++)
    {
        printf("%d\n", head->data);
        head = head->next;
    }
    printf("转置为逆向链表为:\n");
    t = l->next;
    l->next = NULL;   //m->next = NULL;
    while (t != NULL) //(l != NULL)
    {
        m = t;
        t = t->next; //m->next;
        m->next = l;
        l = m;
        //t = t->next;
        //printf("%d\n", l->data);
    }
    for (i = 0; i < n; i++)
    {
        printf("%d\n", m->data);
        m = m->next;
    }
    return 0;
}

设置断点,一步一步跟,看每一步都符合你的预期吗,从哪一步开始就已经不对了?
学编程先学调试,不能总靠猜
简单程序还可以靠把代码都看懂了用大脑模拟,等你写了10000行代码还这么玩不得累死