C语⾔单链表的建⽴和输出(详细分析)
C语⾔单链表的建⽴和输出(详细分析)
1、头⽂件
#include<stdio.h>
#include<stdlib.h>//包含了malloc函数,可以⽤malloc.h代替
C语⾔中malloc是动态内存分配函数
函数原型:void * malloc(unsigned int num_bytes);
参数:num_bytes 是⽆符号整型⽤于表⽰分配的字节数。
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL
void * 表⽰未确定类型的指针,void * 可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道⽤户是⽤这段空间来存储什么类型的数据(⽐如是char还是int或者…)
功能:分配长度为num_bytes字节的内存块
注意:当内存不再使⽤时,应使⽤free()函数将内存块释放。函数返回的指针⼀定要适当对齐,使其可以⽤于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进⾏类型转换。
2、节点的构成
struct Link {
int data;
struct Link* next;
};
为了书写更加简洁⽅便,我们可以使⽤tepyof关键词:
typeof struct Link {
int data;
struct Link* next;
}* Linknode;
3、单链表的创建
(1)⽆头节点的创建
struct Link*CreatLink(struct Link* head){
struct Link *p=NULL,*q=NULL;
int data;
scanf("%d",&data);
while(data !=-1){
p =(struct Link*)malloc(sizeof(struct Link));
p->data = data;
if(head ==NULL)//这⾥判断的含义是指如果这个单链表⾥⼀个数都没有,那么就让head节点成为它第⼀个节点。
head = p;
else
q->next = p;
q = p;
scanf("%d",&data);
}
p->next =NULL;
return head;
}
(2) 有头节点的创建
struct Link*CreatLink(struct Link* head){
struct Link *p=NULL,*q=NULL;
int data;
p =(struct Link*)malloc(sizeof(struct Link));
head = p;
q = p;
scanf("%d",&data);
while(data !=-1){
p =(struct Link*)malloc(sizeof(struct Link));
p->data = data;
q->next = p;
q = p;
scanf("%d",&data);
}
p->next =NULL;
return head;
}
头节点定义:
头节点是为了操作的统⼀、⽅便⽽设⽴的,⼀般来说,头节点放在第⼀元素节点之前,其数据域⼀般⽆意义(当然有些情况下也可存放链表的长度、⽤做监视哨等)。有头节点后,对在第⼀元素节点前插⼊节点和删除第⼀节点,其操作与对其他节点的操作统⼀了。⽽且⽆论链表是否为空,头指针均不为空。
⾸元节点是第⼀元素节点,它是头节点后边的第⼀个节点。
区别:
有头节点的浪费空间,但易理解,边界好处理,不易出错,代码简单;
⽆头节省空间,难理解,边界不易处理,代码稍复杂;
4、单链表的输出
(1)⽆头节点的输出
void PrintLink(struct Link *head){
struct Link *h = head;
if(h ==NULL){//判空
printf("The Link is null");
return;
}
while(h !=NULL){
printf("%d ", h->data);
h = h->next;
}
}
(2)有头节点的输出
void PrintLink(struct Link *head){
struct Link *h = head->next;//跳过头节点
if(h ==NULL){//判空
printf("The Link is null");
return;
}
while(h !=NULL){
printf("%d ", h->data);
h = h->next;
}
}
5、完整代码演⽰
⽆头节点代码:
#include<stdio.h>
#include<stdlib.h>
struct Link {
int data;
struct Link* next;
};
struct Link*CreatLink(struct Link* head){ struct Link *p=NULL,*q=NULL;
int data;
scanf("%d",&data);
while(data !=-1){
p =(struct Link*)malloc(sizeof(struct Link));
p->data = data;
if(head ==NULL)
head = p;
else
q->next = p;
q = p;
scanf("%d",&data);
c语言struct头文件}
p->next =NULL;
return head;
}
void PrintLink(struct Link *head){
struct Link *h = head;
if(h ==NULL){
printf("The Link is null");
return;
}
while(h !=NULL){
printf("%d ", h->data);
h = h->next;
}
}
int main(void){
struct Link *head=NULL;
head =CreatLink(head);
PrintLink(head);
free(head);//释放malloc创建的空间
return0;
}
输⼊:
123456-1
输出:
123456
注:如果有任何问题欢迎⼤家和我⼀起讨论
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论