typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
bool InitList1(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
{
return false;
}
L->next = NULL;
return true;
}
bool InitList2(LinkList& L) {
L = NULL;
return true;
}
bool Empty1(LinkList L) {
if (L->next == NULL) {
return true;
}
else
{
return false;
}
}
bool Empty2(LinkList L) {
if (L==NULL)
{
return true;
}
else
{
return false;
}
}
平均时间复杂度O(n)
//在第i个位置插入元素e
typedef int Elemtype ;
bool ListInsert(LinkList& L, int i, Elemtype e) {
if (i < 1) {
return false;
}
LNode* p;
int j = 0;//表示当前p指向的是第几个结点
p = L;
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->next = s;
return true;
}
不带头结点的表插入数据时需要对i=1的时候特殊处理
//在第i个位置插入元素e
typedef int Elemtype ;
bool ListInsert(LinkList& L, int i, Elemtype 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 = 1;//表示当前p指向的是第几个结点
p = L;
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->next = s;
return true;
}
在p结点之后插入元素e
时间复杂度O(1)
bool InsertNextElem(LNode *p, Elemtype e){
if (p==NULL)
{
return false;
}
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s==NULL)
{
return false;
}
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
在p结点之前插入元素e
时间复杂度O(1)
bool InsertPriorElem(LNode* p, Elemtype 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;
}
将s结点插入到p之前
时间复杂度O(1)
bool InsertPriorNode(LNode *p, LNode *s) {
if (p==NULL || s==NULL)
{
return false;
}
s->next = p->next;
p->next = s;
Elemtype e = p->data;
p->data= s->data;
p->data = e;
return true;
}
按位序删除(带头结点)
时间复杂度O(n)
删除第i个元素的值,用e带回此值
bool ListDelElem(LinkList& L, int i, Elemtype e) {
if (i < 1) {
return false;
}
LNode* p;
int j = 0;//表示当前p指向的是第几个结点
p = L;
while (p != NULL && j < i - 1) {
//循环找到第i-1个结点
p = p->next;
j++;
}
if (p = NULL)
{
return false;
}
if (p->next==NULL)
{
return false;
}
LNode* q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
bool DelNode(LNode* p) {
if (p==NULL)
{
return false;
}
LNode* q = p->next;
p->data = p->next->data;
p->next = q->next;
free(q);
return true;
}
注意:
如果p恰好是最后一个节点,则此法失效,因为p->next=NULL。
这时应另寻它法,给定头指针。找到p的前一个元素,进行删除操作。
时间复杂度O(n)
LNode* GetElem(LinkList L, int i) {
if (i<0)
{
return NULL;
}
LNode* p;
int j = 0;
p = L;//L先指向头结点(第0个结点,不存数据)
while (p!=NULL&&j<i)
{
p = p->next;
j++;
}
return p;
}
注意:
顺序表中按位查找是随机访问,时间复杂度为O(1)
时间复杂度O(n)
LNode* LocateElem(LinkList L, int e) {
LNode* p = L->next;
while (p!=NULL&&p->data!=e)//从第一个节点开始查找data域为e的点
{
p = p->next;
}
return p;//存在e值返回结点指针,不存在返回NULL
}
时间复杂度O(n)
int length(LinkList L) {
int len = 0;
LNode* p = L;
while (p->next!=NULL)
{
p = p->next;
len++;
}
return len;
}
将输入的数据插入到链表的表头,读入数据的顺序与生成链表中的元素相反,L->next=NULL,防止它指向空间中的脏数据。
时间复杂度O(n)
重要应用:链表的原地逆置
LinkList List_HeadInsert(LinkList& L) {
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));//创建头结点
L->next = NULL;//初始化链表
scanf_s("%d", &x);
while (x != 00) {
//输入00结束
s= (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf_s("%d", &x);
}
return L;
}
将输入的数据插入到链表的表尾,读入数据的顺序与生成链表中的元素相同
时间复杂度O(n)
**注意:**必须增加一个尾指针,使其始终指向当前链表的尾结点,便于下一个数的插入。
LinkList List_TailInsert(LinkList& L) {
int x;
L = (LinkList)malloc(sizeof(LNode));//创建头结点
LNode* s, * r = L;
scanf_s("%d", &x);
while (x != 00) {
//输入00结束
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;//r指向新的表尾结点
scanf_s("%d", &x);
}
r->next = NULL;//尾结点指针置空
return L;
}
老铁们,创作不易,顺便点个赞呗,可以让更多的人看到这篇文章,激励一下我这个小白。