一.顺序表
1.定义
顺序表,即线性表的顺序存储,用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构上相邻的两个元素在物理位置上也相邻。
注意:线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。
2.基本操作
2.1插入操作
(无论在顺序表的什么位置插入数据元素,解决办法都是:找到要插入的位置,将后续数据元素整体向后移动一个位置,最后直接在腾出来的位置上插入指定的数据元素。)
bool ListInsert(SqList &L,int i,ElemType e)
{
if(i<1IIi>L.length+1) //判断范围是否有效
return false;
if(L.length>MaxSize)
return false;
for(int j=L.length;j>=i;j–) //元素后移
L.data[j]=l.data[j-1];
L.data[j-1]=e;
L.length++;
return true;
}
- 第一步判断插入位置是否合法,如果不合法则异常退出。
- 第二步判断线性表存储空间是否不足,如果不足则增加存储容量。
- 第三步将插入位置及之后元素后移。
- 第四步将待插入元素插入。
2.2删除操作
bool ListDelete(SqList &L)
{
int i, e;
printf("请输入要删除的元素位置:");
scanf("%d",&i);
if (i<1 || i>L.length + 1)//判断元素下标是否越界
return false;
if (!L.data)//判断是不是空表
{
printf("空表\n");
return false;
}
e = L.data[i - 1];
for (int j = i; j <= L.length; j++)
{
L.data[j-1] = L.data[j];
}
L.length--;//表长-1
printf("删除的元素是%d,这个元素的位置是%d\n", e, i);
return true;
}
- 第一步判断删除位置是否合法,如果不合法则异常退出。
- 第二步将待删除位置元素的值赋于e。
- 第三步将被删除之后的元素左移 。
2.3查找操作
查找数据元素e在表中的位置,可以从表头开始一直遍历表中元素,如果找到与要查找元素e相等的元素,则返回元素在表中的位置,数组下标从0开始,则元素在表中对应的位置序号值应为对应数组下标加1,没有找到则返回0;
int Locate(PSeqList L, DataType e)
{
for (k = 0; k < L->length; k++)
{
if (L->data[k] == e)
{
//k为e对应的数组下标,在表中对应序号应为k+1
return k + 1;
}
}
return 0;
}
{(11条消息) 数据结构:顺序表的基本操作_LiuBo_01的博客-CSDN博客_常对顺序表进行的两种基本操作是
}
二.链式表
1.定义
链表,别名链式存储结构或单链表,用于存储逻辑关系为 "一对一" 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。
2.基本操作
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
}