单链表(带头结点)
关于typedef的解读:
- typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,与auto、static、register等关键字不能出现在同一个表达式中。
- 通常讲,typedef要比#define要好,特别是在有指针的场合。
- 使用模板:typedef <数据类型> <别名>
- 当你把int函数重命名后:
typedef int 整数;
typedef int *整数指针;
当你书写如下代码:
int x =1;
int *p;
代码等价于:
整数 x = 1;
整数指针 p;
- 增强代码可读性,强调返回的值的意义
typedef struct LNode {
int data;
struct LNode *next;
}LNode,*LinkList;
这段代码相当于如下操作:首先定义一个struct LNode的数据类型;再把struct LNode重命名为LNode;再定义一个LinkList作为指向struct LNode的指针。用上述写法是非常简便的。
另外,写LNode * 时,强调的是返回一个结点;LinkList则是强调返回的是一个单链表。实质上两者是等价的。为什么会有区别?因为LinkList L 相当于创建一个头指针L,而根据单链表的特性,你只要定义并找到第一个结点L,实际上剩下的所有指针都可以找到,也就是整个链表可以找到。
源码
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;//数据域
struct LNode* next;//指针域
}LNode, *LinkList;
//头插法建立单链表
LinkList List_HeadInsert(LinkList &L) {
LNode* s;
int i;
L = (LNode *)malloc(sizeof(LNode));//创建头结点
L->next = NULL; //头结点的指针域设置为null
L->data = NULL; //头结点不存储数据
printf("请输入你要存储的数据,999为退出输入:\n");
scanf_s("%d", &i);
while (i != 999)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = i;
s->next = L->next; //实质就是s的后继指针域置为NULL,之所以写L->next是为了实现头插循环
L->next = s;
scanf_s("%d", &i);
}
return L;
}
//判空
bool Empty(LinkList L) {
if (L->next == NULL){
printf("表空.\n");
printf("=======================\n"