一、顺序表
1.定义
顺序表:顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中
2.操作
初始化
1.list makoempty(): 初始化一个空线性表L
2.elementType findkth(int k,list L):根据位序K,返回相应元素
3.int find(elementtype x,list L):在线性表L中查找X的第一次出现位置
4.void insert(elementtype x,int i,list l):在位序前面插入一个新元素x
5.void delete(int i,list l):删除指定位序i的元素
int length(list l):返回线性表L的长度n。
2.1 插入
顺序表插入,在想要插入数据的地方(i),i后面的数据全部后移一个位置,指定数据再放入原i。 还要注意如果位置不够是需要扩容的
1 | 2 | 3 | 4 | 5 | temp |
1 | 2 | 3 | 4 | 5 | |
size-5 | size-4 | size-3 | size-2 | size-1 |
public void insert(int index,int e)
{
for(int i=size;i>=(index+1);i--)
{
array[i]=array[i-1];
}
array[index]=e;
size++;
}
2.2 删除
public void delete(int index)
{
if (size <= 0) {
System.err.println("顺序表为空");
}
for(int i=index;i<=size-2;i++)
{
array[i]=array[i+1];
}
array[--size]=0;
}
2.3 查找
int LocateElem(SqList L,int e){
int i;
//使顺序表从头开始一个一个找,若成功找到,返回其在线性表的位置,没有找到打印错误信息
for(i=0;i<L.length;i++){
if(L.elem[i] == e){
return i+1;
}
}
return 0;
}
二、链式表
1.定义
链表,,用于存储逻辑关系为 "一对一" 的数据。与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。
2.1 长度
创建一个指针p,用于遍历链表。创建一个计数器,用于统计长度。
int Length( List L )
{
List p;
p = L;
int j = 0;
while( p)
{
j++;
p = p->Next;
}
return j;
}
2.2查找
ElementType FindKth( List L, int K )
{
int i = 1;
List p = L;
for( ; i < K && p != NULL;p = p->Next, i++){}
if( i == K && p) return p->Data;
return ERROR;
}
2.3删除
1.定义一个指针p指向链表头
2.如果删除的是表头,直接链表头指向链表头的next
head = head->next;
3.如果删除的是中间的位置。先遍历找到需要删除的节点,
然后p->next = p->next->next->next.
4.最后返回head
注意:删除链表节点,要考虑到空间释放。
struct Test* deletNode(struct Test *head,int data)
{
struct Test *p = head;
if(p->data == data){
head = head->next;
return head;
}
while(p->next != NULL){
if(p->next->data == data){
p->next = p->next->next;
return head;
}
p = p->next;
}return head;
}
printf("************\n");
printLink(head);
head = deletNode(head,3);
printLink(head);