线性表的顺序存储实现
1、利用数组的连续存储空间顺序存放线性表元素
typedef struct LNode *List;
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
struct LNode L;
List PtrL
为了访问下表为i的元素: L.Data[i] PtrL->Data[i]
线性表的长度:L.Last+1 PtrL->Last+1
(1)初始化:建立空的顺序表
List MakeEmpty(){
List PtrL;
PtrL = (List)malloc(sizeof(struct LNode));
PtrL->Last = -1;
return PtrL;
}
(2)查找用二分查找,不要太麻烦了
(3)插入操作:在第i个位置
void Insert(ElementType X,int i, List PtrL){
int j;
if(PtrL->Last == MAXSIZE-1){
prntf("表满");
return;
}
if (i<1 || i>PtrL->Last + 2){
printf(位置不合法);
printf("位置不和法");
}
for (j = PtrL->Last;j>=i-1;j--) PtrL->Data[j+i] = PtrL->Data[j];//后移法
PtrL->Data[i-1] = X;
PtrL->Last++;
return;
}
(4)删除
void Delete (int i, List PtrL)
{
int j;
if(i<1||i>PtrL->Last+1){
printf("不存在");
return;
}
for(j = i;j<=PtrL->Last;j++)
PtrL->Data[j-1] = PtrL->Data[j];
PtrL->Last--;
return;
}
2、利用链式存储实现
区别与数组存储:插入、删除不需要移动数据元素,只需要修改“链”
typedef struct LNode *List;
struct LNode{
ElementType Data;
List Next;
};
struct LNode L;
List PtrL;
(1)求表长
int Length(List PtrL){
List p = PtrL;
int j = 0;
while(p){
p = p->Next;
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; /*找到第K个,返回指针*/
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)插入操作实现
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);
if(p==Null){
printf("error");
return NULL;
}else{
s=(List)malloc(sizeof(struct LNode));
s->Data = X;
s->Next = p->Next;
p->Next = s;
return PtrL;
}
}
也可以改成bool来作判断。
(3)删除
注意将已经给的空间给free掉
List Delete(int i,List PtrL){
https://www.icourse163.org/learn/ZJU-93001?tid=1462787444#/learn/content?type=detail&id=1239897399&cid=1261105616
}
3.广义链表
可以通过定义union的类型来解决类型不定的情况
但是要加一个Tag来说明是什么类型