主要操作的实现
1.初始化(建立空的顺序表)
List MakeEmpty()
{
List Ptrl;
Ptrl = (List)malloc(sizeof(struct LNode));
Ptrl->Last = -1;
return Ptrl;
}
2.查找
int Find(ElementType X, List Ptrl)
{
int i=0;
while(i <= Ptrl->Last && Ptrl->Data[i] != X)
{
i++;
}
if(i > Ptrl->Last) return -1;
else return i;
}
3.插入
void Insert(ElementType X,int i,List Ptrl)
{
int j;
if(Ptrl->Last == MAXSIZE-1)
{
printf("表满");
return;
}
if(i<1 || i>Ptrl->Last+2)
{
printf("插入位置不合法");
return;
}
for(j = Ptrl->Last; j>=i-1; j--) //i-1是第i个数
{
Ptrl->Data[j+1] = Ptrl->Data[j]; //Aj往后 倒序向后移动1
}
Ptrl->Data[i-1] = X;
Ptrl->Last++;
return;
}
4.删除
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; i++)
{
Ptrl->Data[j-1] = Ptrl->Data[j];//Aj+1~An顺序向前移动
}
Ptrl->Last--;
retrun;
}
5.主要操作的实现
(1)求表长
//求表长
int Length(List Ptrl)
{
List p = Ptrl; //p指向链表的第一个结点
int j = 0;
while(p)
{
p = p->Next;
j++; // 此时p指向第j个结点
}
return j;
}
(2)查找(按值/按序号查找)
//按序号查找
List FindKth(int K, List Ptrl)
{
int i=1;
List p = Ptrl;
while(i<K && p !=NULL) //注意是&& 不是||
{
p = p->Next;
i++;
}
if(i == K) return p;
else return NULL;
}
//按值查找
List Find(ElementType X, List Ptrl)
{
List p = Ptrl;
while(p->Data != X && p !=NULL) //注意是&& 不是||
{
p = p->Next;
}
return p; //如果没有找到的话,p就是NULL
}
(3)插入
1.先构造一个新结点,用s指向
2.再找到链表的第i-1个结点,用p指向
3.然后修改指针,插入结点(p之后插入新结点s)
s->Next = p->Next;
p->Next = s;
(顺序不能改变!)
//插入新结点
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;//别忘了把后面的链表链上去ヾ(·ω~)o
return s; //表头不再是Ptrl,s才是新表头
}
p = FindKth(i-1, Ptrl); //之前写的查找函数
if(p == NULL) //判断结点插入位置是否在链表内
{
printf("插入位置不合法");
return NULL;
} else
{
s = (List)malloc(sizeof(struct LNode)); //申请、填装结点
s->Data = X;
s->Next = p->Next; //新结点插入在第i-1个结点的后面
p->Next = s;
return Ptrl;
}
}
(4)删除(删除链表的第i个位置上的结点(1<=i<=n)
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;
if(Ptrl != NULL) Ptrl = Ptrl->Next; //判断表头是否为空 ,不为空则表头指向第二个结点
else return NULL;
free(s);
return Ptrl;
}
p = FindKth(i-1, Ptrl);
if(p == NULL) //判断第i-1个结点是否为空
{
printf("第%d个结点不存在",i-1);
return NULL;
}else if(p->Next == NULL) //判断第i个结点是否为空
{
printf("第%d个结点不存在",i);
return NULL;
}else
{
s = p->Next;
p->Next = s->Next;
free(s); //释放结点空间
return Ptrl;
}
}
6.广义表和多重链表
(1)用“复杂”链表表示二元多项式
(2)广义表
①是线性表的推广
②对线性表来说,n个元素都是基本的单元素
③对广义表来说,这些元素不仅可以是单元素,也可以是另一个广义表
(3)多重链表
链表的结点可能同时隶属多个链。
①结点的指针域会有多个
②但是,包含两个指针域的链表不一定是多重链表,比如:双向链表不是多重链表
③在树、图等复杂结构中有广泛应用