静态链表的增,删,清空,销毁等操作
程序员文章站
2024-03-21 13:09:58
...
创建slinklist.h文件
#pragma once
//静态链表:利用顺序表模拟链表操作,包含两条带头循环链表
//一条为有效数据链表,头结点为0下标;一条为空闲链表,头结点为1下标
#define MAXSIZE 10
typedef struct SNode
{
int data;//数据
int next;//后继指针,其实为后继节点的下标
}SNode,SLinkList[MAXSIZE],*PSLinkList;
//typedef SNode SLinkList[MAXSIZE];
//SLinkList s;
//初始化
void InitList(PSLinkList s);
//头插
bool Insert_head(PSLinkList s,int val);
//尾插
bool Insert_tail(PSLinkList s,int val);
//通过值删除
bool DeleteVal(PSLinkList s,int key);
//通过下标删除
bool DeleteIndex(PSLinkList s,int index);
//通过位置删除
bool DeletePos(PSLinkList s,int pos);
//查找,找到返回下标,失败放回-1
int Search(PSLinkList s,int key);
//和获取有效长度
int GetLength(PSLinkList s);
//判空
bool IsEmpty(PSLinkList s);
//显示
void Show(PSLinkList s);
//清除
void Clear(PSLinkList s);
//销毁
void Destory(PSLinkList s);
创建slinklist,cpp文件
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"slinklist.h"
//判空
static void DeterPointNull(PSLinkList s)
{
assert(s!=NULL);
if(s==NULL)
{
exit(0);
}
}
//判满,空闲链表已经空了(全部结点都已经被使用了)
static bool IsFull(PSLinkList s)
{
return s[1].next==1;
}
//初始化
void InitList(PSLinkList s)
{
DeterPointNull(s);
//初始化有效链表
s[0].next=0;//有效链的头指向自己
//初始化空闲链表
int i=0;
for(i=1;i<MAXSIZE;i++)
{
s[i].next=i+1;
}
s[MAXSIZE-1].next=1;//最后一个空闲节点
}
//头插
bool Insert_head(PSLinkList s,int val)
{
DeterPointNull(s);
if(IsFull(s))
{
return false;
}
//找到第一个空闲节点p
int p=s[1].next;
//将p从空闲链表中剔除
s[1].next=s[p].next;
//将val存放到p中
s[p].data=val;
//将p头插到有效链表
s[p].next=s[0].next;
s[0].next=p;
return true;
}
//尾插
bool Insert_tail(PSLinkList s,int val)
{
DeterPointNull(s);
if(IsFull(s))
{
return false;
}
//找到第一个空闲节点p
int p=s[1].next;
//将p从空闲链表中剔除
s[1].next=s[p].next;
//将val存放到p中
s[p].data=val;
//找到最后一个有效结点
int q;
for(q=0;s[q].next!=0;q=s[q].next);
//将p尾插到有效链表
s[p].next=s[q].next;
s[q].next=p;
return true;
}
//查找key的前驱
static int SearchPri(PSLinkList s,int key)
{
for(int p=0;s[p].next!=0;p=s[p].next)
{
if(s[s[p].next].data==key)//p的后继的数据和key判断
{
return p;
}
}
return -1;
}
//通过值删除
bool DeleteVal(PSLinkList s,int key)
{
int p=SearchPri(s,key);
if(p<0)
{
return false;
}
//删除p的后继结点
int q=s[p].next;
s[p].next=s[q].next;//将q从有效链表中剔除
//将q插入到空闲链中
s[q].next=s[1].next;
s[1].next=q;
return true;
}
//通过下标删除
bool DeleteIndex(PSLinkList s,int index)
{
DeterPointNull(s);
if(index<0)
{
return false;
}
//查找index的前驱结点
int p;
for(p=0;s[p].next!=index;p=s[p].next);
//删除p的后继结点
int q=s[p].next;
s[p].next=s[q].next;//将q从有效链表中剔除
//将q插入到空闲链中
s[q].next=s[1].next;
s[1].next=q;
return true;
}
//通过位置删除
bool DeletePos(PSLinkList s,int pos)
{
DeterPointNull(s);
if(pos<0 || pos>GetLength(s))
{
return false;
}
int p=0;
for(int i=0;i<pos-1;i++)
{
p=s[p].next;
}
//删除p的后继结点
int q=s[p].next;
s[p].next=s[q].next;//将q从有效链表中剔除
//将q插入到空闲链中
s[q].next=s[1].next;
s[1].next=q;
return true;
}
//查找,找到返回下标,失败放回-1
int Search(PSLinkList s,int key)
{
for(int p=0;s[p].next!=0;p=s[p].next)
{
if(s[p].data==key)//p的数据和key判断
{
return p;
}
}
return -1;
}
//返回链表的有效长度
int GetLength(PSLinkList s)
{
int count=0;
for(int p=0;s[p].next!=0;p=s[p].next)
{
count++;
}
return count;
}
//判空
bool IsEmpty(PSLinkList s)
{
return s[0].next==0;
}
//显示
void Show(PSLinkList s)
{
for(int p=s[0].next;p!=0;p=s[p].next)
{
printf("%d ",s[p].data);
}
printf("\n");
}
//清除
void Clear(PSLinkList s)
{
int q;
for(q=0;s[q].next!=0;q=s[q].next);//查找最后一个有效数据结点
s[q].next=s[1].next;
s[1].next=s[0].next;
s[0].next=0;
}
//销毁
void Destory(PSLinkList s)
{
Clear(s);
}
添加功能模块:
利用静态链表实现(A-B)并(B-A),将新的链表保存为A链表。先建立A链表,然后遍历B链表,若B中元素存在于A中,则将A中该元素删除,否则将该元素添加到A中
//利用静态链表实现(A-B)并(B-A),将新的链表保存为A链表。先建立A链表,然后遍历B链表,若B中元素存在于A中,则将A中该元素删除,否则将该元素添加到A中
void Merge(PSLinkList sA,PSLinkList sB)
{
int p=sA[0].next;
int q=sB[0].next;
int tmp=-1;
int tag=0;
while(q!=0)
{
if(sA[p].data==sB[q].data)
{
tmp=sA[p].next;
DeleteIndex(sA,p);
p=tmp;
q=sB[q].next;
}
else
{
if(tag==0)
{
p=sA[p].next;
}
if((tmp<0 && p==0)|| p==tmp)
{
Insert_tail(sA,sB[q].data);
p=sA[p].next;
q=sB[q].next;
tag=0;
}
else if(p==0)
{
p=sA[p].next;
tag=1;
}
}
}
}