尾插法
void CreateList(LinkList& L, int n) {//尾插法
// 正序输入 n 个数据元素,建立带头结点的单链表
LinkList p, q; int i;
L = (LinkList)malloc(sizeof(LNode));
q = L; // 先建立一个带头结点和尾指针的单链表
for (i = 0; i < n; ++i) {
p = (LinkList)malloc(sizeof(LNode));
scanf_s("%d", &p->data); // 输入元素值
q->next = p;
q = p;//指针相等的含义:两指针指向同一位置
} //
q->next = NULL; //修改尾指针
}
逐步解析
每个新插入的结点都在其直接前驱之后,为顺序插入。最后一步q->next = NULL; 不能写成p->next = NULL.如果这么做,编译器会报错“使用了未初始化的指针p”。
代码及结果
一个很普通的尾插法和输出:
#include <stdio.h>
#include <stdlib.h>
constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;
typedef int Status;
typedef struct Node {
ElemType data;
struct Node* next;
}LNode,*LinkList;
void CreateList(LinkList& L, int n) {//尾插法
// 正序输入 n 个数据元素,建立带头结点的单链表
LinkList p, q; int i;
L = (LinkList)malloc(sizeof(LNode));
q = L; // 先建立一个带头结点和尾指针的单链表
for (i = 0; i < n; ++i) {
p = (LinkList)malloc(sizeof(LNode));
scanf_s("%d", &p->data); // 输入元素值
q->next = p;
q = p;//指针相等的含义:两指针指向同一位置
} //
q->next = NULL; //修改尾指针
}
void DisplayLink(LinkList L)//输出链表
{
LinkList p;
p = L->next;//链表名L,L也是头指针的名字,指向头结点。头结点的指针域指向第一个结点(即p->next)
while (p != NULL)//注意一下代码的简洁易懂。p!=NULL比!(p=NULL)常用
{
printf("%d\n",p->data);
p = p->next;//不能用p++,因为链表不是连续存储的
}
}
int main(void)
{
LinkList A;
int m;
printf("您要创建几位的链表\n");
scanf_s("%d", &m);
printf("请输入%d个元素\n",m);
CreateList(A, m);
printf("您已创建链表如下:\n");
DisplayLink(A);
return 0;
}
执行结果如下:
尾插法进阶版
键盘依次接收正整数,以0结束,用尾插法创建单链表。
0包含在链表内:
#include <stdio.h>
#include <stdlib.h>
constexpr auto ERROR = 0;
constexpr auto OK = 1;
typedef int ElemType;
typedef int Status;
typedef struct Node {
ElemType data;
struct Node* next;
}LNode, * LinkList;
void CreateList(LinkList& L) //尾插法
{
LinkList p, q;
L = (LinkList)malloc(sizeof(LNode));
q = L;
int j = 1;
while (j)
{
p = (LinkList)malloc(sizeof(LNode));
scanf_s("%d", &p->data);
j = p->data;
q->next = p;
q = p;
}
q->next = NULL;
}
void DisplayLink(LinkList L)
{
LinkList p;
p = L->next;
while (p != NULL)
{
printf("%d\n", p->data);
p = p->next;
}
}
int main(void)
{
LinkList A;
CreateList(A);
printf("您已创建链表如下:\n");
DisplayLink(A);
return 0;
}
运行结果如下:
0不包含在链表内:
更改尾插法函数如下即可:
void CreateList(LinkList& L) //尾插法
{
LinkList p, q;
L = (LinkList)malloc(sizeof(LNode));
q = L;
int j = 1;
while (1)
{
scanf_s("%d", &j);
if (j == 0)
break;
p = (LinkList)malloc(sizeof(LNode));
p->data = j;
q->next = p;
q = p;
}
q->next = NULL;
}
运行结果: