增删改查
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef char ElemType;
typedef struct Lnode {
ElemType data; //结点的数据域
struct Lnode* next; //节点的指针域
}Lnode,*LinkList;
初始化
Status InitList(LinkList &L) {
L = new Lnode; // 1.生成新节点作为头节点,头指针指向头节点
L->next = NULL; // 2.置空头节点指针域
return OK;
}
计算表长 – 不算头结点
Status CountList(LinkList L) {
Lnode* p = L->next;
Lnode* q;
int count = 0;
while (p)
{
q = p->next;
count++;
p = q;
}
return count;
}
销毁 – 从头指针开始,一次释放所有的结点
Status DestoryList(LinkList &L) {
Lnode* p;
while (L)
{
p = L;
L = L->next;
delete p;
}
return OK;
}
清空
Status ClearList(LinkList& L) {
Lnode* p;
Lnode* q;
while (p==NULL)
{
p = L->next;
q = p->next;
delete p;
p = q;
q = q->next;
}
L->next = NULL;
return OK;
}
判断链表为空
Status IsEmpty(LinkList L){
if (L->next)
{
return 1;
}
else
{
return 0;
}
}
取值 — 取单链表中的第i个元素的内容
Status GetElem(LinkList L,int i,ElemType& e) {
Lnode* p = L->next;
int k = 1;
if (!L->next||k>i) return Error;
while (p && k<i)
{
p = p->next;
++k;
}
e = p->data;
return OK;
}
查找 — 按值查找
Lnode *SerchElem(LinkList L, ElemType e) {
Lnode* p = L->next;
while (p && e != p->data)
{
p = p->next;
}
return p;
}
插入 — 在第i个结点插入新结点
Status InsertElem(LinkList &L, int i, ElemType e) {
Lnode* s;
s->data = e;
Lnode* p = L;
int k = 0;
while (p && k<i-1)
{
p = p->next;
++k;
}
if (!p || i < 1) {
s->next = p->next;
p->next = s;
}
return OK;
}
删除 — 删除第i个节点
Status DeleteElem(LinkList& L, int i) {
Lnode* p = L;
int j = 0;
while (p->next && j<i-1)
{
p = p->next;
++j;
}
if (!p->next || j > i) return ERROR;
Lnode* q = p->next;
p->next = q->next;
delete q;
return OK;
}
单链表的头插法
- 从一个空表开始重复读入数据
- 生成新的节点存储新数据
- 最后一个数据最先插入
#include <iostream>
using namespace std;
// 单链表的建立 --- 头插法/尾插法
// 头插法
Status HeadInsert(LinkList& L, int n) {
L = new Lnode; // 头节点
L->next = NULL;
for (int i = n; i > 0; --i)
{
Lnode* p = new Lnode; // 新节点
cin >> p->data; //输入新节点的数值
p->next = L->next; // 头节点的指针域赋值给新节点指针域
L->next = p; // 新节点链接头节点
}
// 尾插法
Status TailInsert(LinkList& L, int n) {
L = new Lnode;
L->next = NULL;
Lnode* r = new Lnode; // 尾指针
r = L;
for (int i = 0; i < n; i++)
{
Lnode* p = new Lnode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}