编写一个算法,逐个输出 单链表 中所有数据元素。设数据元素的数据类型为int型
题目分析:
和我的上一篇博客2-14一样,这个题目要我们挨个输出线性表里面的数据元素,在此之前我们需要创建一个有数据元素的单链表,再编写输出函数listPrint(Node *head);
不过需要注意的是,单链表分为带头结点和不带头结点两种,在绝大多数情况下,我们选择给单链表安排一个头结点,因为带头结点的单链表在进行插入和删除操作时,有这两个优点:
1.无论在头部、中部还是尾部进行操作,头指针的值都不会被改变;
2.在头部、中部、尾部的操作都一样。
说话得有理有据,不信我画图给你看
考点:
1.创建单链表
2.遍历输出单链表
代码实现:
#include<stdio.h>
#include<stdlib.h>
typedef int dataType; //数据类型为int型
//结点结构体
typedef struct node
{
dataType data; //数据域
struct node *next; //指针域
}Node;
//初始化结点
void listInitiate(Node **head) //双星指针,地址的地址,在初始化时,我们要使地址的值改变,所以使用双星作为参数传入
{
*head = (Node*)malloc(sizeof(Node)); //为头结点分配位置空间(一个结点的大小)
(*head)->next = NULL; //头结点指针域初始默认为空
}
/*尾插发建立单链表——得到的链表是顺序的
利用数组的前n个数建立一条单链表*/
void listBuildRear(Node *head,dataType arr[],int n)
{
Node *p = head; //新增一个指针,用来代替head指针
for(int i = 0;i < n;i++) //循环n次,每次循环都在链表尾部追加一个结点
{
Node *q = (Node*)malloc(sizeof(Node)); //新建立结点,并为之分配内存空间
q->data = arr[i]; //数据域赋值,将数组的第i+1个数字赋给新结点q
q->next = NULL; //单链表最后一个结点的指针域都为空
p->next = q; //将原始单链表最后一个结点指针域指向新结点q,从此q成为最后一个结点,原始最后一个结点变成倒数第二个结点
p = q; //p又指向当前链表最后一个结点,为下一次尾部插入做准备
}
}
//遍历输出函数
void listPrint(Node *head)
{
printf("单链表:");
Node *p = head; //新增一个指针,用来代替head指针
while (p->next != NULL)
{
printf("%d ", p->next->data);
p = p->next; //这一句不要忘了,不然会死循环的,我总是忘掉这一句
}
}
//主函数
int main()
{
Node node; //声明单链表
Node *p = &node; //单链表指针指向单链表node
listInitiate(&p); //初始化单链表
int a[18] = {1,5,22,45,12,16,36,59,48,32,15,33,222,15,64,77,48,32};
listBuildRear(p,a,10); //为单链表安排10个数进去
listPrint(p); //遍历输出单链表中的数据
return 0;
}
运行结果:
代码编译器:Dev-C++
好啦,到此结束啦