C语言---链表的创建

1.代码如下

链表创建有多种方法,这是较好理解的一种

尾插法

#include<stdio.h>  
#include<stdlib.h>  
struct node  
{  
    int data;  
    struct node *next;  
};  
int main(void)  
{  
    int n,i,j,k;  
    scanf("%d",&n);  
    struct node *head,*p,*q,*t;  
    head=NULL;  
    while(n--)  
    {  
        scanf("%d",&k);//设输入2,3,5,8,9  
        p=(struct node *)malloc(sizeof(struct node));  
        p->data=k;  
        p->next=NULL;  
        if(head==NULL)//从if开始到下面的p=q是链表的核心思想  
        {  
            head=p;//为下面输出时从头结点开始遍历做准备,第一个创建的结点,头指针指向这个结点  
        }  
        else//接下来是链表的难点、、设q{2,next},  
        {  
            q->next=p;//q->next={3,next}  
        }  
        q=p;//q={3,next};相当于q指向新设结点     }  
    }  
    t=head;//从头结点开始输出   
    while(t!=NULL)  
    {  
        printf("%d\t",t->data);  
        t=t->next;  
    }  
}  

头插法

#include<stdio.h>
#include<stdlib.h>
struct node
{
	int data;
	struct node *next;
};
int main(void)
{
	int n,i,j;
	struct node *head,*p;
	scanf("%d",&n);
	head=(struct node *)malloc(sizeof(struct node));
	head->next=NULL;
	for(i=0;i<n;i++)
	{
		scanf("%d",&j);
		p=(struct node *)malloc(sizeof(struct node));
		p->data=j;///这三行相比与尾插法有较大不同,相当与是将最开始创建的结点一直往后移动
		p->next=head->next;//新结点的下一个地址为空
		head->next=p;创建的头结点指向新进结点
	}
	while(p!=NULL)
	{
		printf("%d ",p->data);//头插法为逆序输出
		p=p->next;
	}
}
struct node *create(int n)//尾插和头插法另外两种实现
{
	int a;
	struct node *head,*end,*p;
	head=end=(struct node *)malloc(sizeof(struct node));
	head->next=NULL;
    while(n--)
	{
		scanf("%d",&a);
		p=(struct node *)malloc(sizeof(struct node));
		p->data=a;
		end->next=p;/*p->next=head->next;*/
		end=p;/*head->next=p;*/
	}
	p->next=NULL;
	return head;/*return end;*/
} 

猜你喜欢

转载自blog.csdn.net/printfxgd/article/details/79884086