目录
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中元素覆盖为ereturn 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中元素覆盖为ereturn 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;
}
结果: 结束~
有收获的宝宝留个赞赞再走吧~
不胜感激~