1、节点类型
typedef struct LNode{ // 单链表的节点类型
int data; // 数据域
struct LNode *next; // 指针域
}LNode,*LinkList;
2、初始化
// 单链表初始化 (带头结点)
bool InitList(LinkList &L){
L = (LNode*) malloc(sizeof(LNode)); // 分配一个头结点
L->next == NULL; // 头结点暂时还没有结点
return true;
}
3、判断链表是否为空
// 判断单链表为否为空
bool IsEmpty(LinkList L){
if(L->next == NULL){
return true;
}else{
return false;
}
}
4、插入元素
// 在第 i 个位置插入元素 e (带头结点)
bool LinkInsert(LinkList &L,int i ,int e){
if(i<1){
return false;
}
LNode *p; // 指针 p 指向前面当前扫描到的结点
int j = 0; // 当前 p 指向的是第几个结点
p = L; // L 指向头结点,头结点是第0个结点(不存数据)
while(p != NULL &&j<i-1){ // 循环找到第 i-1 个结点
p = p->next;
j++;
}
if(p == NULL){
return false;
}
LNode *s = (LNode *) malloc(sizeof(LNode)); //开辟一个新结点存放新插入的元素
s->data = e; // 将数据存放在 数据域
s->next = p->next; // 断开指针,将新插入的指针域指向p的下一个指针
p->next = s; // 连接
return true;
}
5、删除元素
// 删除L中第i个位置的元素,并用e返回删除的元素 (带头结点)
bool LinkDelete(LinkList &L,int i,int &e){
if(i<1){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i-1){ // 循环找到第 i-1 个位置
p = p->next;
j++;
}
if(p == NULL){
return false;
}
LNode *q = p->next; // 令 p 指向被删除的结点;
e = q->data; // 用 e 将删除的数据返回
p->next = q->next; // 将 q 结点从链中断开
free(q); // 释放结点的存储空间
return true;
}
6、打印输出函数
// 打印输出
int toString(LinkList L){
LinkList p;
p = L->next;
while(p != NULL){
printf("%d ",p->data);
p = p->next;
}
return 1;
}
剩余操作省略
直接上代码全部代码
#include <stdio.h>
#include <stdlib.h>
/*带头结点的单链表*/
typedef struct LNode{ // 单链表的节点类型
int data; // 数据域
struct LNode *next; // 指针域
}LNode,*LinkList;
// 单链表初始化 (带头结点)
bool InitList(LinkList &L){
L = (LNode*) malloc(sizeof(LNode)); // 分配一个头结点
L->next == NULL; // 头结点暂时还没有结点
return true;
}
// 判断单链表为否为空
bool IsEmpty(LinkList L){
if(L->next == NULL){
return true;
}else{
return false;
}
}
// 在第 i 个位置插入元素 e (带头结点)
bool LinkInsert(LinkList &L,int i ,int e){
if(i<1){
return false;
}
LNode *p; // 指针 p 指向前面当前扫描到的结点
int j = 0; // 当前 p 指向的是第几个结点
p = L; // L 指向头结点,头结点是第0个结点(不存数据)
while(p != NULL &&j<i-1){ // 循环找到第 i-1 个结点
p = p->next;
j++;
}
if(p == NULL){
return false;
}
LNode *s = (LNode *) malloc(sizeof(LNode)); //开辟一个新结点存放新插入的元素
s->data = e; // 将数据存放在 数据域
s->next = p->next; // 断开指针,将新插入的指针域指向p的下一个指针
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; //
p->next = s; // 先将链表连接好
s->data = p->data; // 将原来的p结点的数据复制到s结点
p->data = e; // 将原来的p结点的数据换成 e (偷梁换柱)
return true;
}
// 删除L中第i个位置的元素,并用e返回删除的元素 (带头结点)
bool LinkDelete(LinkList &L,int i,int &e){
if(i<1){
return false;
}
LNode *p;
int j=0;
p = L;
while(p!=NULL && j<i-1){ // 循环找到第 i-1 个位置
p = p->next;
j++;
}
if(p == NULL){
return false;
}
LNode *q = p->next; // 令 p 指向被删除的结点;
e = q->data; // 用 e 将删除的数据返回
p->next = q->next; // 将 q 结点从链中断开
free(q); // 释放结点的存储空间
return true;
}
// 按位查找, 返回第 i个结点 (带头结点)
LNode *GetElem(LinkList L,int i){
if(i<0){ // 头结点可以看作第0个结点
return NULL;
}
LNode *p;
p = L;
int j = 0;
while(p!=NULL && j<i){ // 循环找到第i个结点
p = p->next;
j++;
}
return p; // 找到后返回该结点指针,否则返回NULL
}
// 按值查找 - 找到数据域 == e 的结点
LNode *LocalELem(LinkList L,int e){
LNode *p;
p = L->next; // p结点指向头结点的下一个结点
while(p != NULL && p->data != e){
p = p->next;
}
return p; // 找到后返回该结点指针,否则返回NULL
}
// 求单链表的长度
int length(LinkList L){
int len = 0; // 统计表长
LNode *p = L;
while(p->next != NULL){
p = p->next;
len++;
}
return len;
}
// 单链表的建立--尾插法
LinkList List_TailInsert(LinkList &L){
int x;
L = (LNode *) malloc(sizeof(LNode));
L->next = NULL; // 初始化操作 ,建立头指针
LNode *s,*r = L; // r 表示表尾指针
scanf("%d",&x);
while(x!=-1){ // 输入的 x = -1 时结束
s = (LNode *) malloc(sizeof(LNode)); // 开辟新的空间
s->data = x;
r->next = s;
r = s; // r 指向新的表尾结点
scanf("%d",&x);
}
r->next = NULL;
return L;
}
// 单链表的建立--头插法
LinkList List_HeadInsert(LinkList &L){
LNode *s;
int x;
scanf("%d",&x);
L = (LNode *) malloc(sizeof(LNode));
L->next = NULL; // 初始化操作 ,建立头指针
while(x!=-1){
s = (LNode *) malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
// 打印输出
int toString(LinkList L){
LinkList p;
p = L->next;
while(p != NULL){
printf("%d ",p->data);
p = p->next;
}
return 1;
}
int main()
{
LinkList L;
// 头插法
// List_HeadInsert(L);
// 尾插法
List_TailInsert(L);
int len = 0;
len = length(L);
printf("链表长度:%d\n",len);
toString(L);
// 链表删除
int e = -1;
LinkDelete(L,4,e);
printf("删除的元素是 e = %d\n",e);
toString(L);
return 0;
}
测试运行:
56
58
52
52
10
454
-1
删除前链表长度:6
56 58 52 52 10 454 删除第4个元素是 e = 52
删除后链表长度:5
56 58 52 10 454
--------------------------------
Process exited after 5.7 seconds with return value 0
请按任意键继续. . .