(一)含有头结点单链表的基本操作的实现:(初始化、增、删、改、查,等)
单链表的结构定义:
#include <stdio.h> #include <stdlib.h> typedef int ElemType; //定义单链表结构 typedef struct LNode{ //声明节点的类型和指向结点的指针类型 ElemType data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; //重命名为 LNode LinkList为指向LNode的指针类
//注意:
在后续定义一个新的链表时一般表达为: LinkList L ;
定义一个结点指针时一般表达为: LNode *p ;
补充: 关键字typedef --------数据类型重命名
格式: typedef <数据类型> <别名>
函数:malloc---------动态申请内存空间
格式:(Elemtype)malloc(sizeof(Elemtype));
1.单链表的初始化
算法步骤:
1)生成新结点作为头结点,用头指针L指向头结点;
2)将头结点的指针域置空;
//1.初始化,创建头结点
bool InitList(LinkList &L){
L=(LNode *) malloc(sizeof(LNode)); //定义一个新结点作为头结点,用指针L指向头结点
if(L==NULL){ //头结点的指针域包含的是首节点的地址,如果为空则内存不足,分配失败
printf("申请内存空间失败\n");
}
L->next=NULL; //给头指针的指针域置空
return true;
}
2.头插法
算法步骤:
1)从一个空表开始,重复读入数据;
2)生成新结点,将读入的数据存入新结点数据域中;
3)从最后一个结点开始,依次将各结点插入到链表的前端。
//2.采用头插法创建单链表
//单链表建成后,顺序会与自己输入的顺序呈相反的顺序
LinkList List_HeadInsert(LinkList &L){
LNode *s; //定义一个新的结点指针
int x; //定义一个整形变量接收数据
L=(LNode *)malloc(sizeof(LNode)) ; //定义一个新结点作为头结点,用指针L指向头结点
if(L==NULL){ //头结点的指针域包含的是首节点的地址,如果为空则内存不足,分配失败
return false;
}
L->next=NULL; //头结点的指针域设为空,即初始为空链表
scanf("%d",&x); //输入元素值
while(x!=9999){ //当输入9999结束循环
s=(LNode *)malloc(sizeof(LNode)); //创建新的结点s并自动分配内存空间
s->data=x; //把输入的值x赋值给s结点的数据域
s->next=L->next; //进行前插
L->next=s; //将头指针指向新插入的结点S
scanf("%d",&x); //继续输入x
}
return L; //返回一个表
}
3.遍历:定义一个遍历单链表的函数:
//2.有头结点单链表的遍历
void LinkList_Printf(LinkList L){
LNode *p=L->next; //新建一个指针指向首元结点
int count=0; //定义一个计数器,计算单链表的长度
printf("单链表成员有:\n") ;
while(p!=NULL){ //循环结束条件:p的next为空时停止循环
count++; //开始计数
printf("%d ",p->data); //从首元结点开始输出
p=p->next; //移动p指针指向下一个结点
}
printf("\n");
printf("表中共有: %d 个元素\n",count) ;
}
头插法创建单链表的实现:main函数调用头插法函数List_HeadInsert、遍历函数LinkList_Printf
int main(){
LinkList L;
InitList(L);
List_HeadInsert(L);
LinkList_Printf(L);
}
后台显示: