先是数组实现
/*数组实现顺序表*/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int ElementType;
typedef struct
{
ElementType Data[MAXSIZE];
int Last;
}List;
List *MakeEmpty()
{
List *PtrL;//定义指针
PtrL = (List *)malloc(sizeof(List));//申请空间
PtrL->Last = -1;//让它指向-1(无元素);0表示第一个位置
return PtrL;//返回指针
}
int Find(ElementType X,List *PtrL)
{
int i;
while(i <= PtrL->Last && PtrL->Data[i] != X)
{
i++;
}
if(i > PtrL->Last)return -1;//找不到返回-1
else return i; //找到返回下标
}
void Delete(int i, List *PtrL)
{
int j;
if(i < 1|| i > PtrL->Last +1)
{
printf("不存在第%d个元素",i);/*检查空表及删除位置的合法性*/
return ;
}
for(j = i;j <= PtrL->Last;j++)
PtrL->Data[i - 1] = PtrL ->Data[j]; /* 将a i+1 ~ a n 顺序向前移动*/
PtrL->Last--; /*Last 仍指向最后元素*/
return;
}
void Insert(ElementType X,int i,List *PtrL)
{
int j;
if(PtrL-> Last == MAXSIZE-1)
{
printf("表满了\n"); /* 表空间满了,不能插入*/
return ;
}
if(i < 1 || i > PtrL->Last +2)
{
printf("位置不合法\n"); /* 检查插入位置的合法性*/
return ;
}
for(j = PtrL->Last ;j >= i - 1;j--)
{
PtrL->Data[j + 1] = PtrL->Data[j];/*将ai~an倒序向后移动 */
}
PtrL->Data[i - 1] = X;/*新元素插入*/
PtrL->Last++;/*last 仍指向最后元素*/
return ;
}
int main()
{
return 0;
}
下面是链表的相关操作
#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct Node
{
ElementType Data;
struct Node *Next;
}List;
List L,*PtrL;
// 求 表长
int Length(List *PtrL)
{
List *p = PtrL; //p指向表的第一个结点
int j = 0;
while(p)
{
p = p->Next; //当前p指向的是第j个结点
j++;
}
return j;
}
//查找
//A:(按序号查找)
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;//找到第k个,返回指针
else return NULL;//否则返回空
}
//B:(按值查找)
List *Find(ElementType X,List * PtrL)
{
List *p = PtrL;
while(p != NULL && p->Data != X)
p = p->Next;
return p;
}
//插入(在第i- 1(1<= i <= n + 1 )个结点后插入一个值为X的新结点)
//(1) 先构造一个新结点,用s指向
//(2) 再找到链表的第i-1个结点,用p指向
//(3)然后修改指针,插入结点(p之后插入新结点是s)
List *Insert(ElementType X,int i,List *PtrL)
{
List *p,*s;
if(i == 1)
{
s = (List *)malloc(sizeof(List));
s->Data = X;
s->Next = PtrL;
return s;
}
p = FindKth(i - 1,PtrL);
if(p == NULL)
{
printf("参数i错误\n");
return NULL;
}
else
{
s = (List *)malloc(sizeof(List));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
}
//删除
//(1)先找到链表的第i-1个结点,用p指向
//(2)再用指针s指向要被删除的结点(p的下一个结点)
//(3)修改指针,删除s所指结点
//(4)释放s所指结点的空间
List *Delete(int i,List *PtrL)
{
List *p,*s;
if(i == 1) //若要删除的是表的第一个结点
{
s = PtrL; //s指向第1个结点
if(PtrL != NULL)PtrL = PtrL->next; //从链表中删除
else return NULL;
free(s); //释放被删除的结点
return PtrL;
}
p = FindKth(i -1,PtrL); // 查找第i-1 个结点
if(p == NULL)
{
printf("第%d个结点不存在",i-1)return NULL;
}
else if(p ->Next == NULL)
{
printf("第%d个结点不存在",i);return NULL;
}
else
{
s = p->Next; //s指向第i个结点
p->Next = s->Next; // 从链表中删除
free(s); //被删除结点
return PtrL;
}
}
int main()
{
return 0;
}
关于广义表与多重链表