目录
(3)插入 (在第i(1<=i<=n+1)个位置上插入一个值为X的新元素)
(4)删除(在第i(1<=i<=n+1)个位置上删除一个值为X的新元素)
(3)插入(在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点
(4)删除(删除链表的第i(1<=i<=n)个位置上的结点)
1、顺序存储实现(数组)
1.1、定义
typedef struct LNode *List;
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L;
List Ptrl;
1.2、注意操作的实现
(1)初始化(建立空的顺序表)
List MakeEmpty()
{
List Ptrl;
Ptrl = (List)malloc(sizeof(struct LNode);
Ptrl->Last = -1;
return Ptrl;
}
(2)查找 (X)
int Find (ElementType X, List Ptrl)
{
int i = 0;
while(i <=Ptrl->Last && Ptrl->Data[i]!=X)
i++;
if(i > Ptrl->Last) return -1;//如果没找到,返回-1
else return i;
}
(3)插入 (在第i(1<=i<=n+1)个位置上插入一个值为X的新元素)
实现:
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;i++)
Ptrl->Data[j+1] = Ptrl->Data[j];//将a[j]后面的元素依次向后移动
Ptrl->Data[i+1] = X;//新元素插入
Ptrl->Last++;
return ;
}
(4)删除(在第i(1<=i<=n+1)个位置上删除一个值为X的新元素)
实现:
void Delete(int i,List Ptrl)
{
int j;
if(i < 1 || i > Ptrl->Last+1) {
printf("不存在第%d个元素",i);
}
for (j=i;j<=Ptrl->Last;j++)
Ptrl->Data[j-1] = Ptrl->Data[j];
Ptrl->Last--;
return ;
}
2、链式存储(链表)
2.1、定义:
typedef struct LNode *List;
struct LNode {
ElementType Data;//数据域
List Next;//指针域,即下一个结点的位置
};
struct LNode L;
List Ptrl;
2.2、实现操作
(1)求表长
int Length(List Ptrl) {
List p = Ptrl;//p指向表的第一个结点
int j = 0;
while (p) {
P = P->Next;
j++;//当前p指向的是第j个结点
}
return j;
}
(2)查找
a、按序号查找:FindKth;
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;
else
return NULL;
}
b、按值查找:Find
List Find(ElementType X,List Ptrl) {
List p = Ptrl;
while (p!=NUll && p->Data !=X)
p = p->Next;
return p;
}
(3)插入(在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点
实现:
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;
return s; //返回新表头指针
}
p = FindKth(i-1,Ptrl); //查找第i-1个结点
if (p == NULL) { //第i-1个不存在,不能插入
printf("参数i错");
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)个位置上的结点)
实现:
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);
} else if (p->Next == NULL) {
printf("第%d个结点不存在",i);
} else {
s= p->Next; //s指向第i个结点
p->Next = s->Next; //从链表中删除
free(s); // 释放被删除结点
return Ptrl;
}