定义的解析
#include
#include
#include
# define List_Init_Size 100
# define ListIncrement 10
typedef int ElemType;//类型声明,为什么定义 ElemType
typedef struct {//定义一个结构体
ElemType *elem; //存储空间基址
int length; //当前长度(数据元素个数),从这个基址开始存放Eeledef类型的元素
int ListSize;//当前分配的存储容量
} Sqlist;
/*抽象数据类型 : 结构 关系 操作
结构体顺序表包含:起始地址 目前存放的元素个数 当前分配的容量
数据与数据之间的关系:
顺序表:物理上的相邻体现了逻辑上的相连
链表:用指针表示逻辑上相连*/
//讨论:初始化汉化的功能:给结构体里的三个数据赋上初值
bool InitList (Sqlist *L){
L->elem=(ElemType *)malloc/*申请内存空间*/(List_Init_Size*sizeof(ElemType));//malloc申请内存空间,sizeof多大就看前面的ElemType 定义的什么类型的
//if(!L.elem) return false;如果申请到返回1.否则返回0,如果是0,0是系统空间的,所以如果地址是0是不可能分配给你的
if (!L->elem) exit(0) ;//判断基地址是否是0,如果是0往下执行,否则退出。
L->length=0;
L->ListSize=List_Init_Size;
return true;
}
插入解析
//插入
void InsertList(Sqlist *L,int i,ElemType x)
{ //int j;
if(i <1 || i >L->length+1)
{printf("Position error");
return;//输入的位置错误并输出Position error
}
if(L->length>=L->ListSize)
{
printf("overflow");
exit(EXIT_FAILURE);//如果表长和分配的空间相等的时的溢出
}
for(int j=L->length-1;j>= i-1;--j)//给定确定的位置插入
L->elem[j+1]=L->elem[j];
L->elem[i-1]=x;
++L->length;
return;
}
第一章 数据结构
void InsertList(Sqlist *L,int i,ElemType x)
{ //int j;
if(i <1 || i >L->length+1)
{printf("Position error");
return;//输入的位置错误并输出Position error
}
if(L->length>=L->ListSize)
{
printf("overflow");
exit(EXIT_FAILURE);//如果表长和分配的空间相等的时的溢出
}
for(int j=L->length-1;j>= i-1;--j)//给定确定的位置插入
L->elem[j+1]=L->elem[j];
L->elem[i-1]=x;
++L->length;
return;
}
删除
void deleteList(Sqlist *L,int i)
{
int j;
if(i<1 || i>L->length)
{
printf("Position error");
return;
}
for(j=i;j
L->elem[j-1]=L->elem[j];
L->length--;
}
时间复杂度为:O(n)
查找
int Locate(Sqlist L, ElemType x)
{ int i=1;
while(i<=L.length && L.elem[i-1]!=x)
++i;
if(i<=L.length) return i;
else return 0;
}
void unio(Sqlist *La,Sqlist Lb) {
ElemType e;
int La_len=La->length;
int Lb_len=Lb.length;
for(int i=1;i<=Lb_len;++i) {
GetElem(Lb,i,&e);
if(!Locate(*La,e))
InsertList(La,++La_len,e);
}
Output(*La);
}
交集void jiaoji(Sqlist La,Sqlist Lb,Sqlist *Lc){
int k=0;
ElemType ai,bj;
int La_len=ListLength(La);
int Lb_len=ListLength(Lb);
for(int i=1;i<=La_len;i++)
{ for(int j=1;j<=Lb_len;j++)
{GetElem(La,i ,&ai);
GetElem(Lb,j ,&bj);
if(ai==bj){InsertList(Lc,++k,ai);}
}
}
Output(*Lc);
}
合并void mergelist(Sqlist La,Sqlist Lb,Sqlist *Lc){
int i=1,j=1,k=0;
ElemType ai,bj;
int La_len=ListLength(La);
int Lb_len=ListLength(Lb);
while((i<=La_len)&&(j<=Lb_len))
{
GetElem(La,i,&ai);GetElem(Lb,j,&bj);
if(ai<=bj)
{
InsertList(Lc,++k,ai);++i;
}
else {InsertList(Lc,++k,bj);++j;}
}
while(i<=La_len){
GetElem(La,i++,&ai);InsertList(Lc,++k,ai);
}
while(j<=Lb_len){
GetElem(Lb,j++,&bj);InsertList(Lc,++k,bj);
}
Output(*Lc);
}
栈
队列
rear :对头指针
front:队尾指针
//初始化栈
Status InitStack(SqStack *s)
{
s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
if(!s->base)
{
puts("存储空间分配失败!");
return Error;
}
s->top = s->base;
s->stacksize = INIT_SIZE;
return Ok;
}
/* 插入元素e为新的栈顶元素 */
Status Push(LinkStack *S,SElemType e)
{
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data=e;
s->next=S->top; /* 把当前的栈顶元素赋值给新结点的直接后继 */
S->top=s; /* 将新的结点s赋值给栈顶指针,见图中② */
S->count++;
return OK;
}
/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(LinkStack *S,SElemType *e)
{
LinkStackPtr p;
if(StackEmpty(*S))
return ERROR;
*e=S->top->data;
p=S->top; /* 将栈顶结点赋值给p */
S->top=S->top->next; /* 使得栈顶指针下移一位,指向后一结点 */
free(p); /* 释放结点p */
S->count--;
return OK;
}
typedef struct node
{
char data;
struct node *next;
}node,*queueptr;
typedef struct
{
queueptr front;
queueptr rear;
}linkqueue;
//初始化void initqueue(linkqueue *q) //初始化操作,建立一个空队列
{
q->front=q->rear=(queueptr)malloc(sizeof(node));
if(!(q->front))
exit(1);
q->front->next=0;
}
void TransposeSM(TSMatrix X,TSMatrix &T)
{
printf("现在对矩阵进行转置!\n");
cout<<"正在对矩阵进行转置!"<
T.mu=X.nu;
T.nu=X.mu;
T.tu=X.tu;
if(T.tu)
{
int q=1;
for(int col=1;col<=X.nu;++col)//注意不忘了等于
for(int p=1;p<=X.tu;++p)
if(X.data[p].j==col)
{
T.data[q].i=X.data[p].j;
T.data[q].j=X.data[p].i;
T.data[q].e=X.data[p].e;
++q;
}
}
SparseMatrix FastTranspos(SparseMatrix A)
{
SparseMatrix B;
int rowSize[Cols];
int rowStart[Cols];
B.Rows=A.Cols;
B.Cols=A.Rows;
B.Terms=A.Terms;
if(A.Terms>0)
{
int i,j;
for(i=0;i
rowSize[i]=0;
for(i=0;i
rowSize[A.data[i].col]++;
rowStart[0]=0;
for(i=1;i
rowStat[i]=rowStart[i-1]+rowSize[i-1];
for(i=0;i
{
j=rowStart[A.data[i].col];
B.data[j].row=A.data[i].col;
B.data[j].col=A.data[i].row;
B.data[j].value=A.data[i].value;
rowStart[j]++;
}}
return B;
}
时间复杂度为 O(2Cols+2Terms)
Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T) //快速转置
{ //采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
T.mu = M.nu;
T.nu = M.mu;
T.tu = M.tu;
if (T.tu)
{
int col;
int num[100], cpot[100];
for (col = 1; col <= M.nu; ++col)
num[col] = 0; //num数组的初始化
for (int t = 1; t <= M.tu; ++t)
++num[M.data[t].j]; //求M中每一列含有的非零元个数
cpot[1] = 1;
for (col = 2; col <= M.nu; ++col)
cpot[col] = cpot[col - 1] + num[col - 1]; //求cpot向量
int q;
for (int p = 1; p <= M.tu; ++p)
{
col = M.data[p].j;
q = cpot[col];
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].e = M.data[p].e;
++cpot[col];
}//for
}//if
return OK;
}//FastTransposeSMatrix
相对应的练习题
typedef struct node{
struct node *leftchild;
struct node *reathchild;
char data;
}BiTreeNode,*BiTree;
//初始化
void createBiTree (BiTree &T){
char ch;
scanf("%c",&ch);
if('#'==ch)
T=NULL;
else{
T=new BiTreeNode;
T->data=ch;
createBiTree(T->leftchild);
createBiTree(T->reathchild);
}
}
void QX (BiTree T)
{
if(T!=NULL)
{
printf("%c",T->data);
QX(T->leftchild);
QX(T->reathchild);
}
}
//中序
void ZX (BiTree T)
{
if(T)
{
ZX(T->leftchild);
printf("%c",T->data);
ZX(T->reathchild);
}
}
//后序
void HX (BiTree T)
{
if(T)
{
HX(T->leftchild);
HX(T->reathchild);
printf("%c",T->data);
}
}
//高度int GD(BiTree &T)
{
int i,j;
if(T==NULL)
{
return 0;
}
else
{
i=GD(T->leftchild);
j=GD(T->reathchild);
if(i { return j+1; } else { return i+1; } }
int YZJD(BiTree T,int &num)
{
if(T)
{
if(T->leftchild ==NULL &&T->reathchild==NULL)
num++;
YZJD(T->leftchild,num);
YZJD(T->reathchild,num);
}
return num;
}
int JD(BiTree &T)
{
if(T==NULL)
{
return 0;
}
else
return JD(T->leftchild)+JD(T->reathchild)+1;
}
路径长度L:是连接两结点的路径上分支数
外部路径长度:是各叶节点(外节点)到根结点的路径长度之和EPL
树的内部路径长度:是各非结点(内结点)到根结点的路径长度之和IPL
树的路径长度PL=EPL+IPL
第8章 搜索结构