数据结构-编程实现一个单链表的打印
1:首先参考别人的单链表的创建及打印,代码如下:
#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
/*上面只是定义了一个结构体类型,并未实际分配内存空间
只有定义了变量才分配内存空间*/
LNode *creat(int n)
{
int i;
LNode *head, *p1, *p2;
/*head用来标记链表,p1总是用来指向新分配的内存空间,
p2总是指向尾结点,并通过p2来链入新分配的结点*/
int a;
head = NULL;
p2 = NULL;
for (i = 1; i <= n; i++)
{
p1 = (LNode *)malloc(sizeof(LNode));
/*动态分配内存空间,并数据转换为(struct LNode)类型*/
printf("请输入链表中的第%d个数:", i);
scanf_s("%d", &a);
p1->data = a;
if (head == NULL)/*指定链表的头指针*/
{
head = p1;
p2 = p1;
}
else
{
p2->next = p1;
p2 = p1;
}
p2->next = NULL;/*尾结点的后继指针为NULL(空)*/
}
return head;/*返回链表的头指针*/
}
void main()
{
int n;
LNode *q;
printf("请输入链表的长度:/n");
scanf_s("%d", &n);
q = creat(n);/*链表的头指针(head)来标记整个链表*/
printf("/n链表中的数据:/n");
while (q)/*直到结点q为NULL结束循环*/
{
printf("%d ", q->data);/*输出结点中的值*/
q = q->next;/*指向下一个结点*/
}
}
View Code
运行结果:
2:再将上面的代码改进,把打印改进成函数的形式,代码如下:
#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
/*上面只是定义了一个结构体类型,并未实际分配内存空间
只有定义了变量才分配内存空间*/
LNode *creat(int n)
{
int i;
LNode *head, *p1, *p2;
/*head用来标记链表,p1总是用来指向新分配的内存空间,
p2总是指向尾结点,并通过p2来链入新分配的结点*/
int a;
head = NULL;
p2 = NULL;
for (i = 1; i <= n; i++)
{
p1 = (LNode *)malloc(sizeof(LNode));
/*动态分配内存空间,并数据转换为(struct LNode)类型*/
printf("请输入链表中的第%d个数:", i);
scanf_s("%d", &a);
p1->data = a;
if (head == NULL)/*指定链表的头指针*/
{
head = p1;
p2 = p1;
}
else
{
p2->next = p1;
p2 = p1;
}
p2->next = NULL;/*尾结点的后继指针为NULL(空)*/
}
return head;/*返回链表的头指针*/
}
void print(LNode *head)
{
LNode *p;
p = head;
while (p)/*直到结点q为NULL结束循环*/
{
printf("%d ", p->data);/*输出结点中的值*/
p = p->next;/*指向下一个结点*/
}
}
void main()
{
int n;
LNode *q;
printf("请输入链表的长度:");
scanf_s("%d", &n);
q = creat(n);/*链表的头指针(head)来标记整个链表*/
print(q);
}
View Code
运行结果:
3:最终将自己的代码改进,代码如下:
// ConsoleApplication15.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <malloc.h>
typedef struct node//定义链表结构体
{
int data;//节点内容
node *next;//指向结构体的指针,下一个节点
}node;
node *create()//创建单链表
{
int i = 0;//链表中数据的个数
node *head, *p, *q;//这些的本质是节点的地址
int x = 0;
head = NULL;
q = NULL;//初始化q,q代表末节点
p = NULL;
while (1)
{
printf("please input the data:");
scanf_s("%d", &x);
if (x == 0)
break;//data为0时创建结束
p = (node *)malloc(sizeof(node));//用于每次输入链表的数据
p->data = x;
if (++i == 1)//链表头的指针指向下一个节点
{
head = p;
q = p;
}
else
{
q->next = p;//连接到链表尾端
q = p;
}
q->next = NULL;/*尾结点的后继指针为NULL(空)*/
}
return head;
}
int length(node *head)
{
int len = 0;
node *p;
p = head->next;
while (p != NULL)
{
len++;
p = p->next;
}
return len;
}
void print(node *head)
{
node *p;
p = head;
while (p)/*直到结点q为NULL结束循环*/
{
printf("%d ", p->data);/*输出结点中的值*/
p = p->next;/*指向下一个结点*/
}
}
int main()
{
node *head = create();//创建单链表
printf("Length:%d\n", length(head));
print(head);
return 0;
}
View Code
运行结果: