//全部不带头节点的单链表
#include<stdio.h>
#include<stdlib.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; //当前扫描的节点
int j = 0; //指向的第几个节点
p = L; //将其放到头节点上开始操作
while (p != NULL && j < i - 1) {
p = L->next;
j++;
}
if (p == NULL)
return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
s->next = p->next; //->next 指向的是下一个节点 既然都是节点58说的是 原本p的下一个指针指向的附到s上
p->next = s; //59说的是p的下一个指针再指向s
return true;
}
//指定节点的后插操作 没有变化
bool InsertNextNode(LNode* p, int e) {
if (p == NULL)
return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
s->data = e;
if (s == NULL)
return false;
s->next = p->next;
p->next = s;
return true;
}
//指定节点的前插操作 没有变化
bool InsertPriorNode(LNode* p, int e) {
if (p == NULL)
return false;
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL)
return false;
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
//按位序删除
bool ListDelete(LinkList& L, int i, int& e) {
if (i < 1)
return false;
if (i == 1) {
LNode* s = L;
L = s->next;
e = s->data;
free(s);
return true;
}
LNode* p; //当前扫描的节点
int j = 0; //指向的第几个节点
p = L; //将其放到头节点上开始操作
while (p != NULL && j < i - 1) {
p = L->next;
j++;
}
//return InsertNextNode(p, e);//利用后插做前插 下面的正常步骤
if (p == NULL)
return false;
LNode* q = p->next;
q->data = e;
p->next = q->next;
free(q);
return true;
}
void test() {
LinkList L;
InitList(L);
}
LinkList_withoutLNode
最新推荐文章于 2024-07-08 22:12:26 发布