数据结构-编程实现一个单链表的打印
1:首先参考别人的单链表的创建及打印,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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;/*指向下一个结点*/ } }
运行结果:
2:再将上面的代码改进,把打印改进成函数的形式,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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); }
运行结果:
3:最终将自己的代码改进,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
// 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; }
运行结果:
本博文由Leon Zhang原创,若转载,请注明出处。