前段时间学习了浙大版的《数据结构》,具体方法是:mooc上面的浙大数据结构视频+看陈越主编的《数据结构》这本书。将视频上面的代码敲了下来,为了方便自己及大家复习所用,现整理如下:
一、线性结构:
1.线性表的顺序存储的几种操作
//1.初始化 建立空的顺序表
List MakeEmpty()
{
List PtrL;
PtrL=(List)malloc(sizeof(struct LNode));
PtrL->Last=-1;
return PtrL;
}
//2.查找 在L中找到与X相等的数据元素
#define ERROR -1
Position Find(List L, ElementType X)
{
Position i=0;
while(i<=L->Last && L->Data[i]!=X)
i++;
if(i>L->Last) return ERROR;
else return i;
}
//3.插入操作实现 1=<i<=n+1 MAXSIZE表示 表的长度
void Insert(ElementType X,int i,List PtrL)
{
int j;
if(PtrL->Last == MAXSIZE-1) //Last表示最后数字的下标
{
printf(" 表满 ");
return false;
}
if(i<1 || i>PtrL->Last+2) //检查插入位置的合法性 1=<i<=n+1
{
printf("位置不合法");
return;
}
for(j=PtrL->Last;j>=i-1;j--)
PtrL->Data[j+1]=PtrL->Data[j];
PtrL->Data[i-1]=X;
return;
}
//删除(删除表的第i(1《i《n))
void Delete(int i;List PtrL)
{
int j;
if(i<1 || i>PtrL->Last+1 ) //检查空表及删除位置的合法性
{
printf("不存在第%d个元素",i);
return;
}
for(j=i;j<=PtrL->Last;j++)
PtrL->Data[j-1]=PtrL->Data[j];
PtrL->Last--;
return;
}
2.线性表的链式储存的几种操作
//线性表的链式储存,单链表结构
typedef struct LNode* PtrTolNode;
struct LNode
{
ElementType Data;
PtrTolNode Next;
};
typedef PtrToLNode Position;//这里的位置是结点的地址
typedef PtrToLNode List;//同样也可以用List定义具体的表头结点指针,该指针就代表一个链式表
//1.求表长
int Length(List PtrL)
{
List p=PtrL; //p指向表的第一个结点
int j=0;
while(p)
{
p=p->Next;
j++;
}
return j;
}
//2.查找
//2.1按序号查找FindKth
#define ERROR -1
int FindKth(List L,int K) //得到第K个元素
{
//根据指定的位序K,返回L中相应元素
Position p;
int cnt=1;//位序从1开始
while(p && cnt<k)
{
p=p->Next;
cnt++;
}
if((cnt==K)&& p)
return p->Data;//找到第K个
else
return ERROR;
}
// 按值查找,即定位Find
#define ERROR NULL//用空地址表示错误
Position Find(List L, ElementType X)
{
Position p=L;//p指向L的第一个结点
while(p && p->Data!=X)
p=p->Next;
if(p)
return p;
else
return ERROR;
}
//插入 在指定位序i(1=<i<=n+1)前插入一个新元素X
#define ERROR NULL
List Insert(List PtrL,ElementType X,int i)
{
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);//查找第i-1个结点
if(p==NULL)
{
printf("参数i错");
return NULL;
}
else
{
s=(List)malloc(sizeof(struct LNode));//申请 填装结点
s->Data=X;
s->Next=p->Next; //新结点插入在第i-1个结点的后面
p->Next=s;
return PtrL;
}
}
//删除
List Delete(int i,List PtrL)
{
List p,s;
if(i==1)
{
s=PtrL;//s指向第1个结点
if(PtrL!=NULL)PtrL=PtrL->Next;//从链表中删除
else return NULL;
free(s);
return PtrL;
}
p=FindKth(i-1,PtrL); //查找第i-1个结点的结点
if(p==NULL)
{
printf("第%d个结点不存在",i-1);return NULL;
}
else if(p->Next==NULL)
{
printf("第%d个结点不存在",i);return NULL;
}
else
{
s=p->Next; //s指向第i个结点
p->Next=s->Next;//从链表中删除
free(s); //释放被删除结点
return PtrL;
}
}