目录
1.带头结点的初始化以及检查单链表是否为空
2.不带头结点的单链表初始化以及表是否为空检查
3.带头结点按位序插入
4.不带头结点的按位序插入
5.带头结点的后插,前插,按位删除,删除固定节点操作
6 不带头结点的后插,前插,按位删除,删除固定节点操作,
注意!!!以下代码是在c++环境中写的c代码,用了c++代码的&
1.带头结点的初始化以及检查单链表是否为空
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
//带头节点的单链表
//定义结构体变量
typedef struct LNode {
int data;
struct LNode* next;
}lNode,*LinkList;
//初始化
bool InitList(LinkList &L ) {
//申请一篇空间来存储存储头节点,并使L指向这个节点
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
return false;
L->next = NULL;
return true;
}
//检查单链表是否为空
bool Empty(LinkList L) {
return (L->next==NULL);
}
int main() {
//定义头指针
LinkList L;
InitList(L);
printf("查看单链表是否为空:%s\n", Empty(L) ? "是" : "否");
return 0;
}
结果:
2.不带头结点的单链表初始化以及表是否为空检查
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//不带头节点的单链表
//定义结构体变量
typedef struct LNode {
int data;
struct LNode *next;
} LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L) {
//头指针赋值为空
L = NULL;
return true;
}
//判断单链表是否为空
bool Empty(LinkList L) {
return (L == NULL);
}
int main() {
LinkList L;
InitList(L);
printf("查看单链表是否为空:%s\n",Empty(L) ? "是":"否");
return 0;
}
结果:
3.带头结点按位序插入
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
//带头节点的单链表
//定义结构体变量
typedef struct LNode {
int data;
struct LNode* next;
}lNode,*LinkList;
//初始化
bool InitList(LinkList &L ) {
//申请一篇空间来存储存储头节点,并使L指向这个节点
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
return false;
L->next = NULL;
return true;
}
//检查单链表是否为空
bool Empty(LinkList L) {
return (L->next==NULL);
}
//插入,在第i个位置插入元素e
bool InsertList(LinkList& L, int i, int e) {
//判断i范围是否合法
if (i < 1)
return false;
//定义一个指针指向当前扫描的结点,使其刚开始指向头结点(L在初始化的时候指向了头结点),
LNode* p = L;
int j = 0;//定义当前p指向的是第几个结点
while (p != NULL && j < i - 1) {
//此函数是为了寻找第i-1个节点
p = p->next;
j++;
}
//处理当插入位置的前一个节点(即第 i−1 个节点)不存在
if (p == NULL)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
int main() {
//定义头指针
LinkList L;
InitList(L);
printf("查看单链表是否为空:%s\n", Empty(L) ? "是" : "否");
return 0;
}
结果跟上回一样,就不展示了
4.不带头结点的按位序插入
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
//不带头节点的单链表
//定义结构体变量
typedef struct LNode {
int data;
struct LNode *next;
} LNode,*LinkList;
//初始化单链表
bool InitList(LinkList &L) {
//头指针赋值为空
L = NULL;
return true;
}
//判断单链表是否为空
bool Empty(LinkList L) {
return (L == NULL);
}
bool ListInsert(LinkList& L,int i,int e ) {
if (i < 1)
return false;
//处理在第一个节点处插入
if (i == 1) {
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s;
return true;
}
//处理在除第一个节点外插入,先找到该节点的前一个节点
LNode* p;//指针p指向当前扫描到的节点
int j = 1;//当前p指向的是第几个节点
p = L;//p指向第1个节点(注意不是头结点)
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL)//i太大
return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
int main() {
LinkList L;
InitList(L);
printf("查看单链表是否为空:%s\n",Empty(L) ? "是":"否");
return 0;
}
结果和上回一样,就不贴图了
5.带头结点的后插,前插,按位删除,删除固定节点操作
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
//带头节点的单链表
//定义结构体变量
typedef struct LNode {
int data;
struct LNode* next;
}lNode,*LinkList;
//添加函数原型的声明
bool InitList(LinkList& L);
bool Empty(LinkList L);
bool InsertList(LinkList& L, int i, int e);
bool InsertNestNode(LNode* p, int e);
bool InsertPriorNode(LNode* p, int e);
bool ListDelete(LinkList& L, int i, int& e);
bool DeleteNode(LNode* p, int& e);
bool PrintList(LinkList L);
//初始化
bool InitList(LinkList &L ) {
//申请一篇空间来存储存储头节点,并使L指向这个节点
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
return false;
L->next = NULL;
return true;
}
//检查单链表是否为空
bool Empty(LinkList L) {
return (L->next==NULL);
}
//插入,在第i个位置插入元素e
bool InsertList(LinkList& L, int i, int e) {
//判断i范围是否合法
if (i < 1)
return false;
//定义一个指针指向当前扫描的结点,使其刚开始指向头结点(L在初始化的时候指向了头结点),
LNode* p = L;
int j = 0;//定义当前p指向的是第几个结点
while (p != NULL && j < i - 1) {
//此函数是为了寻找第i-1个节点
p = p->next;
j++;
}
return InsertNestNode(p, e);
}
//指定节点的后插操作,在p节点之后插入元素e
bool InsertNestNode(LNode *p, int e) {
//处理当插入位置的前一个节点不存在
if (p == NULL)
return false;
LNode* s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next= s;
return true;
}
//前插操作:在p结点前面插入元素e,(还是后插,只是把里面的数据换一下顺序)
bool InsertPriorNode(LNode *p,int e) {
if (p == NULL)
return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
s->next = p->next;
s->data = p->data; //将p中的元素复制到s中
p->next = s; //新节点s连到p之后
p->data = e; //p中元素覆盖为e
return true;
}
//按位序删除
bool ListDelete(LinkList& L, int i, int& e) {
if (i < 1)
return false;
LNode* p;
p = L;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL)
return false;
if (p->next == NULL)
return false;
LNode* q = p->next;
p->next = q->next;
e=q->data;
free(q);
return true;
}
//删除指定节点p
bool DeleteNode(LNode* p, int& e) {
//此方法不能删除最后一个节点!注意,只能传入头指针从头遍历来删除最后的结点
LNode* q = p->next;
if(p == NULL||q==NULL)
return false;
p->data = q->data; //和后继节点交换数据域
p->next = q->next; //将*q结点从链中“断开”
free (q); //释放后继节点的存储空间
return true;
}
//打印单链表的元素
bool PrintList(LinkList L) {
LNode* p = L;
while (p != NULL) {
printf("%d\n", p->data);
p = p->next;
}
printf("NULL\n");
return true;
}
int main() {
// 定义头指针
LinkList L;
InitList(L);
printf("查看单链表是否为空:%s\n", Empty(L) ? "是" : "否");
// 插入一些元素
InsertList(L, 1, 10);
InsertList(L, 2, 20);
InsertList(L, 3, 30);
InsertList(L, 2, 15); // 插入在第二个位置
printf("链表内容:");
PrintList(L);
// 删除一些元素
int e;
ListDelete(L, 2, e); // 删除第二个位置的元素
printf("删除第二个位置的元素:%d\n", e);
printf("链表内容:");
PrintList(L);
// 在第一个节点前插入元素
InsertPriorNode(L->next, 5);
printf("在第一个节点前插入5:");
PrintList(L);
// 删除指定节点
DeleteNode(L->next, e);
printf("删除第一个节点后的节点,其值为:%d\n", e);
printf("链表内容:");
PrintList(L);
return 0;
}
结果:
6 不带头结点的后插,前插,按位删除,删除固定节点操作,
注:也就按位删除和带头结点的有区别,因为得考虑第一个节点
代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
//不带头节点的单链表
//定义结构体变量
typedef struct LNode {
int data;
struct LNode *next;
} LNode,*LinkList;
//添加函数原型的声明
bool InitList(LinkList& L);
bool Empty(LinkList L);
bool InsertList(LinkList& L, int i, int e);
bool InsertNestNode(LNode* p, int e);
bool InsertPriorNode(LNode* p, int e);
bool ListDelete(LinkList& L, int i, int& e);
bool DeleteNode(LNode* p, int& e);
bool PrintList(LinkList L);
//初始化单链表
bool InitList(LinkList &L) {
//头指针赋值为空
L = NULL;
return true;
}
//判断单链表是否为空
bool Empty(LinkList L) {
return (L == NULL);
}
bool InsertList(LinkList& L,int i,int e ) {
if (i < 1)
return false;
//处理在第一个节点处插入
if (i == 1) {
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s;
return true;
}
//处理在除第一个节点外插入,先找到该节点的前一个节点
LNode* p;//指针p指向当前扫描到的节点
int j = 1;//当前p指向的是第几个节点
p = L;//p指向第1个节点(注意不是头结点)
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
return InsertNestNode(p, e);
}
//后插操作
bool InsertNestNode(LNode* p, int e) {
//处理当插入位置的前一个节点不存在
if (p == NULL)
return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//前插操作:在p结点前面插入元素e,(还是后插,只是把里面的数据换一下顺序)
bool InsertPriorNode(LNode* p, int e) {
if (p == NULL)
return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
s->next = p->next;
s->data = p->data; //将p中的元素复制到s中
p->next = s; //新节点s连到p之后
p->data = e; //p中元素覆盖为e
return true;
}
//按位序删除
bool ListDelete(LinkList& L, int i, int& e) {
if (i < 1)
return false;
// 删除第一个节点的特殊处理
if (i == 1) {
if (L == NULL)
return false;
LNode* q = L;
e = L->data;
L = L->next;
free(q);
return true;
}
LNode* p;
p = L;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL)
return false;
if (p->next == NULL)
return false;
LNode* q = p->next;
p->next = q->next;
e = q->data;
free(q);
return true;
}
//删除指定节点p
bool DeleteNode(LNode* p, int& e) {
//此方法不能删除最后一个节点!注意,只能传入头指针从头遍历来删除最后的结点
LNode* q = p->next;
if (p == NULL || q == NULL)
return false;
p->data = q->data; //和后继节点交换数据域
p->next = q->next; //将*q结点从链中“断开”
free(q); //释放后继节点的存储空间
return true;
}
//打印单链表的元素
bool PrintList(LinkList L) {
LNode* p = L;
while (p != NULL) {
printf("%d\n", p->data);
p = p->next;
}
printf("NULL\n");
return true;
}
int main() {
// 定义头指针
LinkList L;
InitList(L);
printf("查看单链表是否为空:%s\n", Empty(L) ? "是" : "否");
// 插入一些元素
InsertList(L, 1, 10);
InsertList(L, 2, 20);
InsertList(L, 3, 30);
InsertList(L, 2, 15); // 插入在第二个位置
printf("链表内容:");
PrintList(L);
// 删除一些元素
int e;
ListDelete(L, 2, e); // 删除第二个位置的元素
printf("删除第二个位置的元素:%d\n", e);
printf("链表内容:");
PrintList(L);
// 在第一个节点前插入元素
InsertPriorNode(L->next, 5);
printf("在第一个节点前插入5:");
PrintList(L);
// 删除指定节点
DeleteNode(L->next, e);
printf("删除第一个节点后的节点,其值为:%d\n", e);
printf("链表内容:");
PrintList(L);
return 0;
}
结果:
结束~
有收获的宝宝留个赞赞再走吧~
不胜感激~