2-15编写一个算法,逐个输出单链表中所有数据元素。设数据元素的数据类型为int类型(参考作者Chaim16)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef int dataType;
typedef struct node
{
dataType data; //数据域
struct node *next; //指针域
}Node;
void listInitiate(Node **head) //双星指针,地址的地址,在初始化时,我们要使地址的值改变,所以使用双星作为参数传入
{
*head = (Node*)malloc(sizeof(Node)); //为头结点分配位置空间(一个结点的大小)
(*head)->next = NULL; //头结点指针域初始默认为空
}
void listBuildRear(Node *head,int n)//尾插法插入数据
{
Node *p = head; //新增一个指针,用来代替head指针
srand(time(NULL));//随机函数
for(int i = 0;i < n;i++) //循环n次,每次循环都在链表尾部追加一个结点
{
Node *q = (Node*)malloc(sizeof(Node)); //新建立结点,并为之分配内存空间
q->data = rand()%10; //将数据赋值给数据域
q->next = NULL; //单链表最后一个结点的指针域都为空
p->next = q; //将原始单链表最后一个结点指针域指向新结点q,从此q成为最后一个结点,原始最后一个结点变成倒数第二个结点
p = q; //p又指向当前链表最后一个结点,为下一次尾部插入做准备
}
printf("\n");
}
//遍历输出函数
void listPrint(Node *head)
{
printf("单链表:");
Node *p = head; //新增一个指针,用来代替head指针
while (p->next != NULL)
{
printf("%d ", p->next->data);
p = p->next; //这一句不要忘了,不然会死循环的,我总是忘掉这一句
}
}
//主函数
int main(void)
{
Node node; //声明单链表
Node *p = &node; //单链表指针指向单链表node
listInitiate(&p); //初始化单链表
listBuildRear(p,10); //为单链表安排10个随机数据数进去
listPrint(p);
system("pause"); //遍历输出单链表中的数据
return 0;
}