中国大学慕课——浙江大学数据结构 2.1线性表的顺序存储(用数组实现)
#include <stdio.h>
#include <stdlib.h>
//#define MAXSIZE 100;
const int MAXSIZE = 100;
struct LNode
{
int data[MAXSIZE];//可以开一个数组 也可以用一个指针 来表示数组的首地址
int len;//线性表的长度 或者叫做数组的最后一个元素
};
typedef struct LNode *list;
struct LNode L;
//初始化 建立一个空表
list make_empty()
{
list PtrL;
PtrL = (list)malloc(sizeof(struct LNode));
PtrL->len = -1;
return PtrL;
}
//查找
int find(int x, list ptr)
{
int i = 0;
while (i <= ptr->len&&ptr->data[i] != x)
{
i++;
}
//两种情况对应while里的两个条件
if (i > ptr->len)
{
return -1;//没找到返回-1
}
else
{
return i;//找到了返回下标
}
}
//插入操作 将x插到第i个位置
void insert(int x, int i, list ptr)
{
int j;
if (ptr->len == MAXSIZE - 1)
{
printf("表满!\n");
return;
}
if (i<1 || i>ptr->len + 2)
{
printf("插入位置不合法!\n");
return;
}
for (j = ptr->len; j >= i - 1; j--)
{
ptr->data[j+1] = ptr->data[j];
}
ptr->data[i - 1] = x;
ptr->len++;
return;
}
//删除
void Delete(int i, list ptr)
{
if (i<1 || i>ptr->len + 1)
{
printf("删除的位置不合法!\n");
return;
}
int j = 0;
for (j = i; j <= ptr->len; j++)
{
ptr->data[j - 1] = ptr->data[j];
}
ptr->len--;
return;
}
int main(void)
{
return 0;
}
几个注意点:
1、由于malloc的函数类型为void * 但是申请的连续空间是一个结构体类型的指针,所以要进行强制转换成结构体类型
2、插入操作,插到第i个位置,其实是把插入的元素放在了第i-1的位置上。判断插入位置时,有两种情况,一种是插入位置小于数组,另一种是插入位置大于数组
*小的时候,i<1不能是i<0 ,因为当i<0时,有可能插入到-1的位置,这是非法操作!
大的时候,插入的位置可以是数组最后一个元素的下一个位置(尾插),但不能是len+2这个位置!
**
3、插入操作,移动元素一定一定是从最后一个元素一个一个往后移动!
如果是for (j = i-1; j <= ptr->len; j++) 那data[i-1]到data[ptr->len+1]都是同一个值,即移之前data[i-1]的值
4、删除操作,移动元素时要和插入时候区分,删除元素一定是从要删除元素的下一个开始,一个一个往前移动。此时的删除并没有真正删除,而是下一个元素覆盖了要删除元素的值。