代码中的笔记是根据《浙江大学》的数据结构mooc课程整理而成
#include <bits/stdc++.h>
using namespace std;
typedef int ElementType;
//1.顺序表的定义
typedef struct LNode* List; //List是一个指针类型
struct LNode
{
ElementType Data;
List Next;
};
struct Lnode L; //新建一个链表L
List PtrL; //表头
//主要操作:1.求表长
int Length(List PtrL)
{
List p=PtrL; //p指向表的第一个结点
int j = 0;
while (p) //当p不为空的时候
{
p = p->Next;
j++;
}
return j;
}
//主要操作 :2.查找
//(1)按序号查找:FindKth;
List FindKth(int K, List PtrL)
{
List p = PtrL;
int i = 1;
while (p != NULL && i < K)
{
p = p->Next;
i++;
}
if (i == K)
{
return p;
}
else return NULL;
}
//(2)按值查找:Find
List Find(ElementType X, List PtrL)
{
List p = PtrL;
while (p != NULL && p->Data != X)
{
p = p->Next;
}
return p;
}
//以上两种查找方式平均时间性能为O(n);
//3.插入:将一个值为X的新结点插入到i位置处(在第i-1个结点后面)
//(1)先构造一个新结点,用s指向;
// (2)再找到链表的第i-1个结点,用p指向;
//(3)然后修改指针,插入结点(p后面插入的新结点是s)
// (4)注意要先修改s的指向,再修改p的指向
List Insert(ElementType X, int i, List PtrL)
{
List p, s;
if (i == 1) //新结点插入在表头
{
s = (List)malloc(sizeof(struct LNode)); //申请、填装结点
s->Data = X;
s->Next = PtrL;
return s;
}
p = FindKth(i - 1, PtrL);
if (p == NULL)
{
cout << "参数i错误";
return NULL; //return null;很重要!
}
else
{
s = (List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
}
//4.删除:删除链表的第i个位置上的结点
// 主要:要将那个删除的结点的空间释放掉!用free函数
// 找到结点后要用一个指针指向他,这是他的表示方法!
//(1)找到链表的第i-1个结点,用p指向(那么s,即第i个结点,就是p的下一个)
// (2)用指针s指向要被删除的结点
// (3)将指针p的指向改成指针s的指向
// (4)最后释放s所指结点的空间
List Delete(int i, List PtrL)
{
List p, s;
if (i == 1) //要删除的是表头的第一个结点
{
s = PtrL;
if (PtrL == NULL) //要判断一下表是不是一个空表
{
return NULL;
}
else
{
PtrL = PtrL->Next;
free(s);
return PtrL;
}
}
p = FindKth(i - 1, PtrL);
if (p == NULL)
{
cout << "第" << i-1 << "个结点不存在啊";
}
else if (p->Next = NULL)
{
cout<< "第" << i << "个结点不存在啊";
}
else
{
s = p->Next;
p->Next = s->Next;
free(s);
return PtrL;
}
}
//Ok,以上就是今天敲的链表的基本操作