我想写一段将链表结点元素输出的代码,但是第一个结点就输出不了,可以帮忙看看吗?

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct node{
	int data;
	struct node* next;
}node,*linklist;
void intlist(linklist l){
	l=(node*)malloc(sizeof(node));
	l->next=NULL;
}
void creatfromhead (linklist l,int n){
	int a;
	node *s;
	for (int i = 0; i <n; i++)
	{
		s=(node*)malloc(sizeof(node));
		scanf("%d",&a);
		s->data=a;
		s->next=l->next;
		l->next=s;
	}
}
void main(){
	int n,i;
	scanf("%d",&n);//n链表结点个数,默认为12,i显示第几个元素
	linklist l;
	l=(linklist)malloc(sizeof(node));
	intlist(l);
	creatfromhead(l,n);
	linklist p;
	p=l->next;
	for (i=(-1); i <n+1 ; i++)
	{
	if(i==0){
    p=NULL;
	printf("NO!");
	}
    else if(i==(-1)){
    p=l;
	printf("NO!");
	}
	else
        {
            i=i--;
            while(p!=NULL&&(i-1)!=0)
            {
                p=p->next;
                i=i--;
            }
			if (i==0)
				printf("%d",p->data);//为什么指向第一个结点输出数据就成问题了呢?
			else
				printf("NO!");
			
			
        }
	
	}

		
}

 

看了一下代码,小伙子要加强学习啊,代码我加了些注释,有些问题还是要注意的,加油!

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

typedef struct node
{
    int data;
    struct node *next;
} node, *linklist;

void intlist(linklist *l)
{
    *l = (node *)malloc(sizeof(node));
    (*l)->next = NULL;
}

void creatfromhead(linklist *l, int n)
{
    int a;
    //node *s;

    //首节点
    scanf("%d", &a);
    (*l)->data = a;

    //问题3:只有头尾两个节点,中间的丢失了
    linklist lastNode = *l;
    for (int i = 0; i < n-1; i++)
    {
        node * s = (node *)malloc(sizeof(node));
        scanf("%d", &a);
        s->data = a;
        s->next = (*l)->next;
        lastNode->next = s;
        lastNode = s;
    }
}



void main()
{
    int n, i;
    scanf("%d", &n); //n链表结点个数,默认为12,i显示第几个元素

    linklist l;
    //l = (linklist)malloc(sizeof(node));//问题1:这里和intlist重复分配内存
    intlist(&l);//问题2: malloc在函数里面是临时的,需要使用二级指针或者return 指针回来
    creatfromhead(&l, n);//同2

    linklist p;
    //问题4:应从首节点开始
    p = l;//l->next;//指向第二个节点
    for (i = 0; i < n; i++)
    {
        //问题5:搞不太清楚是什么目的,只能重写一下
        if(p->next!=l)//看creatfromhead是循环链表,如果不是就用p->next!=NULL
        {
            printf("%d", p->data);
            p=p->next;
        }
        else
        {
            printf("NO!");
        }

        /*
        if (i == 0)//第二步:此时由-1到0,把P设NULL了
        {
            p = NULL;
            printf("NO!");
        }
        else if (i == (-1))//第一步:初始值就是l不是更好吗
        {
            p = l;
            printf("NO!");
        }
        else//第三步:P都NULL了,肯定异常啊
        {
            i = i--;
            while (p != NULL && (i - 1) != 0)
            {
                p = p->next;
                i = i--;
            }
            if (i == 0)
                printf("%d", p->data); //为什么指向第一个结点输出数据就成问题了呢?
            else
                printf("NO!");
        }
        */
    }
}