很多正在学C语言的小伙伴可能很快就会学到结构体了,当然单链表可是结构体里面的一块硬骨头,在单链表中我们要能够创建,删除,添加,打印单链表,今天我们就来说一说创建单链表。
单链表的创建又分为两种情况,分别为头插法,和尾插法。当然,我们今天的重点不在这里,我们今天的重点在于头节点,头指针创建单链表(我们今天所用的方法都是头插法)
首先,我们先来介绍一下头结点,和头指针。
头结点:
1.
点是为了操作方便而设立的,放在第一个元素结点之前,其数据一般无意义
(但也可以用来存放链表长度)
2.结节点,对第一个元素结点前插入和删除第一结点操作与其它结点的操作就统一了;
头指针:
1.
向链表第一个结点的指针,若链表有头结点,则是指向头结点的指针。
2.链表是否为空,头指针均不为空;
3.针是链表的必要元素;
接下来,我们将用头指针和头结点创建两个单链表给大家演示一下;
利用头结点
/*创建链表方式2*/
#include "stdio.h"
#include "stdlib.h"
struct node
{
int data;
struct node *next;
};
struct node *creat()
{
struct node *p,*L;
L=(struct node*)malloc(sizeof(node));//创建一个头结点(其实毫无用处)
L->next=NULL; //把头结点的指针域变为NULL
int a;
do
{
p=(struct node *)malloc(sizeof(node));
printf("input a number");
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}while(p->data!=0);
return L;
}
void print(struct node *L) //打印链表
{
struct node *p;
p=L;
while(p->next!=NULL)
{
p=p->next;
printf("%d",p->data);
}
}
int main()
{
struct node *L=creat();
print(L);
return 0;
}
考虑到大家可能对于伪代码的使用不习惯,我所给大家呈现的都是源代码;
接下来我们用头指针试试
#include "stdio.h"
struct node
{
int data;
struct node *next;
};
struct node *creat(struct node head)
{
struct node *p,*q;
q=p=(struct node *)malloc(sizeof(node));
printf("input a number");
scanf("%d",&p->data);
p->next=NULL;
while(p->data!=0)
{
if(head==NULL)
{
head=p;
}
else
q->next=p;
q=p;
p=(struct node *)malloc(sizeof(node));
print("input a number");
scanf("%d",&p->data);
}
return head;
}
void print(struct node *head)
{
struct node *p;
p=head;
while(p->next!=NULL)
{
printf("%d",p->data);
p=p->next;
}
}
int main()
{
struct node *head;
head==NULL;
head=creat(head);
print(head);
return 0;
}
相信大家在看完两个代码后发现了他们俩一丢丢区别;
所谓的头结点就是第一个代码在create函数先创建一个结点L
;
我们再创造第一个链表的时候并没有对L进行赋值,只是让它的next指针指向我们需要赋值的p结点,实现链接。
头指针就是第二个代码在main函数中申明的head指针;
我们用第一个head指针指向我们的创建的p结点,然后对后续进行操作;
可能大家还会有别的疑惑
比如说create函数为什么要用指针函数;
答案是这样的,使用指针函数返回值需要是一个指针;
我们接下来print函数中形参是指针;我们刚好可以利用指针函数的返回值对print函数操作
在数据结构的书籍中大家可能还会见到这样申明结构体的
typedef struct Node
{
int data;
struct Node *next
}Node,*LinkList;
这里的LinkList 就等于我们上面的(struct node *),起到一个简化的作用,下面只要写到struct node *都可以写成LinkList
node 主要用于结点而LinkList 主要用于指针;
今天的分享就到这里了,如果有错误希望大家能及时向我提出。