欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

静态链表的增,删,清空,销毁等操作

程序员文章站 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;
   }
  }
 }
}
相关标签: 基于c的数据结构