10.3 头插法新建链表实战
10.3.1 流程图
10.3.1.1 整体的流程图
10.3.1.2 循环的流程图
10.3.2 代码
- !!!头指针始终指向头结点!!!
- 头插法:实则就是不断地插元素插在头结点的后面
- 最初要先给头结点的指针域赋值为
NULL
#include <stdio.h>
#include <stdlib.h>
//头插法新建链表
//定义链表的数据结构
typedef int type;
typedef struct LNode{
type data;
LNode *next;
}LNode, *LinkList;
//输入数据1 2 3 4 5 99999
void linklist_head_insert(LinkList &L){
// LinkList h;//先新建一个头指针,每一个链表一定会有一个头指针,头指针指向的就是头结点!!!(头结点不是第一个结点)
// 上一句是错的,非常非常严重的,因为本来传递过来的L,就已经是头指针了,并不需要再新建一个头指针了
L = (LinkList) malloc (sizeof(LNode)); //一定要记得分配空间!!!就是声明一个头结点
L->next = NULL;//因为一开始还没有除头结点以外的结点,所以h-next 就是空
int x;//保留第一个结点的数据域
scanf("%d", &x);
LinkList s;//插入的结点
while(x != 99999){
s = (LinkList) malloc (sizeof(LNode));//一定要记得分配空间!!!
s->data = x;//把x赋值给插入的结点
s->next = L->next;//让插入的结点指向原本的第一个结点
L->next = s;//让头结点指向插入的结点
scanf("%d", &x);//输入下一个插入的值
}
}
//输出链表
void print_linklist(LinkList L){
L = L->next;
while(L){
printf("%3d",L->data);
L = L->next;
}
printf("\n");
}
int main() {
LinkList L;
linklist_head_insert(L);
print_linklist(L);
return 0;
}
10.4 尾插法新建链表实战
10.4.1 流程图
10.4.1.1 整体的流程图
10.4.1.2 循环的流程图
- 错误的思维:!!!记住,此时是直接在尾部插入,后面并没有结点了,只要新建的结点与尾指针所指的结点串起来就行!!!
- 正确的思维:
10.4.2 代码
- 一定要在最后给尾指针的指针域赋值为
NULL
- 只需要新结点与尾指针所指的结点串起来就行,并不需要管新结点的后继结点是什么:
因为:新结点的后继结点要么是新来的结点,要么是NULL,全由尾指针控制,与新结点无关。
- 输出代码一定要记得:把指针指向下一个!!!
#include <stdio.h>
#include <stdlib.h>
//尾插法新建链表
typedef int type;
typedef struct LNode{
type data;
LNode *next;
}LNode, *LinkList;
//从尾部插入元素
void LinkList_tail_insert(LinkList &L){
L = (LinkList) malloc(sizeof(LNode));
LinkList s, r = L;
int x;
scanf("%d",&x);
while(x != 99999){
s = (LinkList) malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
}
//输出单链表
void print_LinkList(LinkList L){
L = L->next;
while(L){
printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
int main() {
LinkList L;
LinkList_tail_insert(L);
print_LinkList(L);
return 0;
}
10.5 按位置及按值查找实战
10.5.1 按位置查找
- 位置详解图
- 可以从0号位置开始查
10.5.1.1 流程图
10.5.2 按值查找
- 遍历到最后还没有找到,要记得加上
return NULL
10.5.2.1 流程图
10.5.3 代码
#include <stdio.h>
#include <stdlib.h>
typedef int type;
typedef struct LNode{
type data;
LNode *next;
}LNode, *LinkList;
//尾插法插入元素
void LinkList_tail_insert(LinkList &L){
L = (LinkList) malloc(sizeof(LNode));
LinkList s, r = L;
int x;
scanf("%d",&x);
while(x != 99999){
s = (LinkList) malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
}
//按位置查找
LinkList select_pos(LinkList L, int pos){
int i = 0;//从第0个位置可以查
//判断查询位置是否合理
if(pos < 0){
return NULL;
}
//按位置查询
while(L && i < pos){
L = L->next;
i++;
}
return L;
}
//按值查找
LinkList select_val(LinkList L, int val){
while(L){
if(L->data == val){
return L;
}
L = L->next;
}
return NULL;
}
int main() {
LinkList L, search;
LinkList_tail_insert(L);
search = select_pos(L, 2);
if(search){
printf("select success\n");
printf("the element in 2 location is %d\n", search->data);
}else{
printf("select failure\n");
}
search = select_val(L, 9);
if(search){
printf("select success\n");
printf("the element is %d", search->data);
}else{
printf("select failure\n");
}
return 0;
}
10.6 往第i
个位置插入元素实战
10.6.1 流程图
10.6.2 代码
#include <stdio.h>
#include <stdlib.h>
//单链表结点的定义
typedef int ElemType;
typedef struct LNode{
ElemType data;
LNode *next;
}LNode, *LinkList;
//尾结点插入法新建链表
void LinkList_tail_insert(LinkList &L){
L = (LinkList) malloc(sizeof(LNode));
LinkList s, r = L;
int x;
scanf("%d",&x);
while(x != 99999){
s = (LinkList) malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
}
//打印链表
void print_LinkList(LinkList L){
L = L->next;
while(L){
printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
//查找第i个位置
LinkList select_pos(LinkList L, int pos){
//判断位置的合理性
if(pos < 0){
return NULL;
}
int i = 0;//从第0个位置开始
while(L && i < pos){
L = L->next;
i++;
}
return L;
}
//向第i个位置插入值为val的元素
bool LinkList_medium_insert(LinkList &L, int i, ElemType val){
//判断插入位置的合理性
if(i < 1){
return false;
}
//先找到i-1个位置
LinkList front, p;
front = select_pos(L, i-1);
p = (LinkList) malloc(sizeof(LNode));
p->data = val;
p->next = front->next;
front->next = p;
return true;
}
int main() {
LinkList L, search;
bool res;
LinkList_tail_insert(L);
print_LinkList(L);
search = select_pos(L, 5);
if(search != NULL){
printf("%d\n", search->data);
}else{
printf("failure");
}
res = LinkList_medium_insert(L, 2 , 9);
print_LinkList(L);
if(res){
printf("success");
}else{
printf("failure");
}
return 0;
}