头指针: 链表中第一个结点的存储位置,用来标识单链表。
头结点: 在单链表第一个结点之前附加的一个结点,为了操作上的方便。
以带头结点为例的头插法和尾插法。
头插法
1.先定义结点结构体,每一个结点包括数据域和指针域。
typedef int ElemType;
//声明结构体类型
typedef struct LNodde{
ElemType data;//数据域
strcut LNode* next;//指针域
}LNode,*LinkList;//LNode=struct LNode,LinkList=struct LNode*
2.先创建头指针,再创建头结点,头结点中不存放数据且指针域为空。
3.读取输入的数据并插入数据。
L = (LinkList)malloc(sizeof(LNode));//创建头结点
L->next = NULL;//设置头结点的指针域为空
LinkList s; int x;
scanf("%d", &x);//读入数据
while (x != 9999) {
s = (LinkList)malloc(sizeof(LNode));//创建结点
s->data = x;//向创建好的结点中存入数据
s->next = L->next;//插入数据
L->next = s;
scanf("%d", &x);
}
尾插法
1.先定义结点结构体,每一个结点包括数据域和指针域。
typedef int ElemType;
//声明结构体类型
typedef struct LNodde{
ElemType data;//数据域
strcut LNode* next;//指针域
}LNode,*LinkList;//LNode=struct LNode,LinkList=struct LNode*
2.先创建头指针,再创建头结点,头结点中不存放数据且指针域为空。
3.读取输入的数据并插入数据。
L = (LinkList)malloc(sizeof(LNode));//创建头结点
L->next = NULL;//头结点的指针域为空
LinkList s=NULL,r=L; int x;
scanf("%d", &x);//读入数据
while (x != 9999) {
s = (LinkList)malloc(sizeof(LNode));//创建结点
s->data = x;//向创建好的结点中存入数据
r->next = s;//插入操作
r = s;
scanf("%d", &x);
}
s->next = NULL;//将最后一个结点的指针域置为空
打印链表: 看每一个结点的指针域是否为空,不为空则打印。
void PrintList(LinkList L) {
L = L->next;
while (L != NULL) {
printf("%3d", L->data);
L = L->next;
}
}
源代码
//线性表的链式表示
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;
}LNode,*LinkList;
void PrintList(LinkList L)
{
L = L->next;
while (L != NULL)
{
printf("%d", L->data);//打印当前结点数据
L = L->next;//指向下一个结点
if (L != NULL)
{
printf(" ");
}
}
printf("\n");
}
LinkList CreateList1(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));//创建头结点
L->next = NULL;//头结点的指针域为空
LinkList s; int x;
scanf("%d", &x);//读入数据
while (x != 9999) {
s = (LinkList)malloc(sizeof(LNode));//创建结点
s->data = x;//向创建好的结点中存入数据
s->next = L->next;//插入数据
L->next = s;
scanf("%d", &x);
}
return L;
}
LinkList CreateList2(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));//创建头结点
L->next = NULL;//头结点的指针域为空
LinkList s=NULL,r=L; int x;
scanf("%d", &x);//读入数据
while (x != 9999) {
s = (LinkList)malloc(sizeof(LNode));//创建结点
s->data = x;//向创建好的结点中存入数据
r->next = s;//插入操作
r = s;
scanf("%d", &x);
}
r->next = NULL;//将最后一个结点的指针域置为空
return L;
}
int main() {
LinkList L;//创建一个头指针
//头插法
CreateList1(L);
PrintList(L);
//尾插法
CreateList2(L);
PrintList(L);
return 0;
}