一:顺序存储
1.初始化
List MakeEmpty(){
List PtrL;
PtrL = (List)malloc( sizeof(struct LNode) ); //申请结构
PtrL->Last = -1; //没有元素
return Ptrl; //返回指针
}
2.求长度
-
int getLength(SqList &L){
-
return L.length;
-
}
3.查找
int Find(ElementType X, List PtrL ){ //查找X
int i = 0;
while( i <= PtrL->Last && PtrL->Data[i]!= X )
i++;
if( i > PtrL->Last )
return -1; //如果没找到,返回-1
else
return i; //找到后返回的是存储位置
}
4.插入
在第 i 个位置插入一个值为X的元素,先移动 i 及其后面元素的位置(从最后一个开始往后移动),再插入
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--)
PtrL->Data[j+1] = PtrL->Data[j]; //将ai~an 倒序向后移动
PtrL->Data[i-1] = X; //插入元素
PtrL->Last++; //Last仍指向最后元素
return;
}
5.删除
后面的元素依次前移
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[j-1] = PtrL->Data[j]; //将ai+1 ~ an 顺序向前移动
PtrL->Last--; //Last仍指向最后元素
return;
}
二.链式表
2.1插入操作
(插入到第i个结点, 先找到第i-1 个节点, 然后, 让插入结点的指针域指向i-1个结点的指向的指针域, 再修改第i-1结点的指针域, 使其指向插入结点. 注意, 修改指针指向的顺序不要颠倒, 不然会导致找不到第i个结点. 对于边界情况也同样适合.)
bool insertNode(Link head, int index, int item) { int count=0; Link p = head; Link node; while(p != NULL && count < index-1) //找到第index前一个结点 { p = p->next; count++; } if(p == NULL) { return false; //没有找到第i-1个结点 } else { node = (Link)malloc(sizeof(Node));//申请一个结点 node->data = item; //结点的数据域 node->next = p->next; //修改指针指向关系 p->next = node; return true; } }
2.2删除操作
( 依次遍历链表的数据域 与要查找的数据进行比较,找到要删除的结点, 用free()函数释放该节点, 并修改删除结点两边指针关系情况,要保证p,q指针一前一后: 在插在过程中, 若发现结点p指向的数据域不等于x, 则p,q指针同时向前移动,即可若在查找过程一直没有找到要删除的结点(链表遍历完毕),则退出循环,返回错误)
bool deleteNode(Link head,DateType x)
{
Link p,q;
if(head==NULL || head->next==NULL) //链表没有数据,返回错误
{
return false;
}
p=head->next; //初始化p,q 并保证p,q 一前一后
q=head;
while(p!=NULL)
{
if(p->data==x) //找到结点x ,删除并将两边结点链接起来
{
q->next=p->next;
free(p);
return true;
}
else //没有找到,p,q依次往前移动
{
q=p;
p=p->next;
}
}
//若循环结束了,说明没有找到该结点
return false;
}
2.3查找操作
( 依次遍历链表的数据域 与要查找的数据进行比较)
bool queryNode(Link head, int x)
{
Link p = head->next;
while(p != NULL)
{
if(p->data == x) //查找成功
{
printf("d",p->data);
return true;
}
p = p->next; //没有找到,移动结点
}
return false; //查找失败返回false
}