线性表的循序表示:
typedef int Position;
typedef struct LNode *PtrToNode;
struct LNode{
ElementType Data[MAXSIZE];
Position Last;
};
顺序表的初始化:
List MakeEmpty(){
List l;
l=(List)malloc(sizeof(struct LNode));//创建一个顺序表
l->Last=-1;//顺序表的索引值为-1,进行初始化
return l;
}
顺序表的查找
#define ERROR -1// 将错误信息ERROR的值定义为-1
Position Find(List l,ElementType x){//返回查找元素的所在位置
Position i=0;//从0起始位置开始
while(i<=l->Last&&l->Data[i]!=x)//判断条件
i++;
if(i>l->Last) return ERROR;
else return i;
}
顺序表的插入
bool Insert(List l,ElementType x,int i) {
// l:要插被入的顺序表,x;要插入的元素 ,i:要插入的位置
Position j;//用来做记号
if(l->Last==MAXSIZE-1){//判断是否表满
//表已满,不能插入
printf("表满");
return false;
}
if(i<1||i>l->Last+2){//判断是否插入的位置对不对
//插入的是数组的第i号前,
printf("位序不合法") ;
return false;
}
//在判断完所有不合法的情况后,就开始正常插入了
for(j=l->Last;j>=i-1;j--){//把要插入位置后的元素都向后移一位
l->Data[j+1]=l->Data[j];
}
l->Data[i-1]=x;//插入
l->Last++;//最后标记向后移动一位
return true;
}
顺序表的删除操作
bool Delete(List l,int i){
//从l中删除指定位序的元素,该元素数组的下标i-1
Position j;
//判断 删除的位置是否合适
if(i<1&&i>l->Last+1) {
printf("位序%d不存在元素",i);
return false;
}
for(j=i;j<=l->Last;j++){//第i号元素后的元素,向前移动一位
l->Data[j]=l->Data[j+1];
}
l->Last--;//数组末尾标记减一
return true
}
线性表的链式存储实现:
typedef struct LNode * PtrToLNode;
struct LNode{
ElementTyped Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;//这里的位置是结点的地址
typedef PtrToLnode List;
求表长:
int Length(List L){
Position p;
int cnt=0;//初始化计时器
p=L;//p指向表的第一个结点
while(p){
p=p->Next;
cnt++;
}
return cnt;
}
查找:按序号
ElementType FindKth(List L,int K){
Position p;
int cnt=1;//位序从1开始
p=L;//p指向L的第一个结点
while(p&&cnt<K){
p=p->Next;
cnt++;
}
if((cnt==K)&&p)
return p->Data;//找到第K个
else
return ERROR;//返回错误信息
}
查找:按值查找
ElementType Find(List L,ElementType X){
Position p=L;//p指向L的第一个结点
while(p&&p->Data!=X){
p=p->Next;
}
return p;
}
插入
List Insert(List L,ElementType X,int i){
Position tmp,pre;
tmp=(Position)malloc(sizeof(struct LNode));//申请,填装结点
tmp->Data=X;
if(i==1){
tmp->Next=L;
return tmp;//返回新表头指针
}else{
int cnt=1;
pre=L;
while(pre&&cnt<i-1){
pre=pre->Next;
cnt++;
}
if(pre==NULL||cnt!=i-1){
printf("插入位置参数错误\n");
free(tmp);
return false;
}else{
tmp->Next=pre->Next;
pre->Next=tmp;
return L;
}
}
}
带头结点的链式表的插入函数:
bool Insert(List L,ElementType X,int i){
//默认L有头结点
Position tmp,pre;
int cnt=0;
//查找位序为i-1的结点
pre=L;//pre指向表头
while(pre&&cnt<i-1){
pre=pre->Next;
cnt++;
}
if(pre==NULL&&cnt!=i-1){
printf("插入位置参数错误");
return false;
}else{
tmp=(Position)malloc(sizeof(struct LNode));//申请 填装结点
tmp->Data=X;
tmp->Next=pre->Next;
pre->Next=tmp;
return true;
}
}
删除
bool Delete(List L,int i){
Position pre,tmp;
int cnt=0;
//查找位序为i-1的结点
pre=L;
while(pre &&cnt<i-1){
pre=pre->Next;
cnt++;
}
if(pre==NULL||cnt!=i-1||pre->Next=NULL){
//所找结点或位序为i的结点不在L中
printf("删除位置错误\n");
return false;
}else{
tmp=pre->Next;
pre=tmp->Next;
free(tmp);
return true;
}
}