排序
//直接插入排序
void insertSort(List R,int n)
{
int i,j
for(i=2
{
R[0]=R[i]
j=i-1
if(R[0].key<R[j].key) //岗哨与其前面的值比较
{
R[j+1] = R[j]
j--
}
R[j+1]=R[0]
}
}
//冒泡排序
void bubbleSort(List R, int n)
{
int i,j,temp,endsort
for(i=1
{
endsort=0
for(j=1
{
if(R[j].key>R[j+1].key)
{
temp = R[j]
R[j] = R[j+1]
R[j+1] = temp
endsort = 1
}
}
if(endsort==0) break
}
}
//快速排序
void quickSort(List R,int low,int high)
{
int i,j,x
i=low
j=high
x=R[i]
while(i<j&&x.key<=R[j].key) --j
if(i<j)
{
R[i] = R[j]
++i
}
while(i<j&&x.key>=R[i].key) ++i
if(i<j)
{
R[j] = R[i]
--j
}
R[i]=x
if(low<i-1)
{
quickSort(R,low,i-1)
}
if(high>j+1)
{
quickSort(R,j+1,high)
}
}
//直接选择排序
void selectSort(List R,int n)
{
int i,j,min
for(i=1
min = i
for(j=1
{
if(R[j].key<R[min].key)
{
min=j
}
if(min!=i)
{
temp = R[i]
R[i] = R[min]
R[min] = temp
}
}
}
}
//二路归并
void mergeSort(List R,List a,int m,int h,int n)
{
int j = m+1
int k = h
while(h<=m&&j<=n)
{
if(a[h].key<=a[j].key)
{
R[k]=a[h]
h++
}
else{
R[k]=a[j]
j++
}
k++
}
while(h<=m)
{
R[k]=R[h]
h++
k++
}
while(j<=n)
{
R[k]=R[j]
j++
k++
}
}
//二分查找
int searchBin(sqtable T,int n,int key)
{
int low = 1
int high = T.n
while(low<=high)
{
mid = (high+low)/2
if(T.elem[mid].key == key){
return mid
}else if(T.elem[mid].key<key){
high=mid-1
}else{
low=mid+1
}
}
return 0
}
//散列查找
int searchHash(keyType key,openHash HL)
{
d=H(key)
i=d
while(HL[i].key != NULLkey && HL[i].key!=key)
{
i=(i+1)%m
}
if(HL[i].key == key) return i
else return 0
}
二叉链表
typedef struct btnode
{
datatype data;
struct btnode *lchild,*rchild;
}*BinTree;
BInTree bt;
void preorder(BinTree bt)
{
if(bt!=NULL)
{
visit(bt);
preorder(bt->lchild);
preorder(bt->rchild);
}
}
void inorder(BinTree bt)
{
if(bt!=NULL)
{
inorder(bt->lchild);
visit(bt);
inorder(bt->rchild);
}
}
void lastorder(BInTree bt)
{
if(bt!=NULL)
{
lastorder(bt->lchild);
lastorder(bt->rchild);
visit(bt);
}
}
int leafnum(BinTree bt)
{
if(bt==NULL)
return 0;
else if(bt->lchild==NULL && bt->rchild == NULL)
return 1;
else
return (leafnum(bt->lchild)+leafnum(bt->rchild));
}
int onenum(BinTree bt)
{
if(bt==NULL)
return 0;
else if((bt->lchild!=NULL && bt->rchild == NULL) || (bt->lchild==NULL && bt->rchild != NULL))
return (onenum(bt->lchild)+onenum(bt->rchild)+1);
else
return (onenum(bt->lchild)+onenum(bt->rchild));
}
int twonum(BinTree bt)
{
if(bt==NULL)
return 0;
else if(bt->lchild!=NULL && bt->rchild != NULL)
return (twonum(bt->lchild)+twonum(bt->rchild)+1);
else (bt->lchild == NULL || bt->rchild == NULL)
return (twonum(bt->lchild)+twonum(bt->rchild));
}
int notleafnum(BinTree bt)
{
if(bt==NULL)
return 0;
else if(bt->lchild==NULL && bt->rchild == NULL)
return 0;
else
return (notleafnum(bt->lchild)+notleafnum(bt->rchild)+1);
}
int allnum(BinTree bt)
{
if(bt==NULL)
return 0;
else
return (allnum(bt->lchild)+allnum(bt->rchild)+1);
}
int data8num(BinTree bt)
{
if(bt==NULL)
return 0;
else if(bt->data==8)
return (data8num(bt->lchild)+data8num(bt->rchild)+1);
else
return (data8num(bt->lchild)+data8num(bt->rchild));
}
int height(BinTree bt)
{
int l,h;
if(bt==NULL)
return 0;
else
{
l=height(bt->lchild);
r=height(bt->rchild);
return 1+(l>r?l:r)
}
}
线性表的顺序存储
//顺性表的定义
const maxsize = 10;
typedef struct
{
dataType data[maxsize]
int length
} sqlist
sqlist L
//顺序表的插入
void insert(sqlist L,datatype x,int i)
{
if(L.length == maxsize) error("表满")
if(i<1 || i>L.length) error("位置错")
for(j=L.length
L.data[j] = L.data[j-1]
L.data[i-1] = x
L.length++
}
//顺序表的删除
void delete(sqlist L,int i)
{
if(i<1 || i>L.length) error("位置错")
for(j=i
L.data[j-1]=L.data[j]
L.length--
}
//顺序表的定位
int loacate(sqlist L,datatype x)
{
int i=0
while(L.data[i]!=x&&i<L.length)
i++
if(i<L.length) return i+1
else return 0
}
//顺序表改为单链表
void *CreateLink(dataType a[],int n)
{
linkList head
Node *p
head = malloc(sizeof(Node))
head->next = NULL
for(i=n-1
{
p=malloc(sizeof(Node))
p->data=a[i]
p->next = head->next
head->next=p
}
return head
}
//顺序表逆置
void revert(int a[],int n)
{
int i,temp
for(i=0
{
temp = a[i]
a[i] = a[n-i-1]
a[n-i-1] = temp
}
}
线性表的链式存储
//单链表的定义
typedef struct node{
dataType x
struct node *next
}Node,*linkList
//单链表的初始化
Linklist initalLink()
{
Linklist head
head = malloc(sizeof(Node))
head->next = NULL
return head
}
//单链表的长度
int length(Linklist head)
{
Node *p
p=head
while(p->next!=NULL)
{
p=p->next
j++
}
return j
}
//插入
void insert(Linklist head,int i,datatype x)
{
Node *p,*q
if(i==1) p=head
else p=getLinklist(head,i-1)
if(p==NULL) error("找不到插入位置")
else {
q=malloc(sizeof(Node))
q->next = p->next
q->data = x
p->next = q
}
}
//删除
void delete(Linklist head,int i)
{
Node *p,*q
if(i==1) p=head
else p=getLinklist(head,i-1)
if(p!=NULL && p->next!=NULL)
{
q=p->next
p->next = q->next
free(p)
}else{
error("找不到删除位置")
}
}
//读表中的元素
Node *getLinklist(Linklist head,int i)
{
Node *p
p=head->next
while(j<i&&p!=NULL)
{
p=p->next
j++
}
if(j==i) return p
else return NULL
}
//定位
int locateLinklist(Linklist head,dataType x)
{
Node *p
p=head->next
while(p!=NULL&&p->data!=x)
{
p=p->next
j++
}
if(p!=NULL) return j
else return 0
}
//将值为x的值插入单链表中,使得L仍然有序
void insert(Linklist L,datatype x)
{
Node *p,*q
Linklist s
p=L
q=L->next
while(q!=NULL&&q->data<x)
{
p=q
q=q->next
}
s=malloc(sizeof(Node))
s->data=x
s->next=q->next
q->next=s
}
//将值为x的值插入单循环链表表中,使得L仍然有序
void insert(Linklist L,datatype x)
{
Node *p,*q
p=L
q=p->next
Linklist s
while(q!=L&&q->data<x)
{
p=q
q=q->next
}
s=malloc(sizeof(Node))
s->data=x
s->next=q->next
q->next=s
}
图
//图的存储结构定义
typedef int EdgeType
typedef char VertexType
typedef struct graph{
int n,e
EdgeType edge[MaxVertex][MaxVertex]
VertexType vertex[MaxVertex]
}
//向图中插入一条边
void Addgraphedge(Graph *G,VertexType x,VertexType y)
{
int i=-1
for(int k=0
{
if(G->vertex[k]==x) i=k
if(G->vertex[k]==y) j=k
}
if(i==-1||j==-1) error("找不到插入位置")
else{
G->edge[i][j]=1
G->edge[j][i]=1
G->e++
}
}
//矩阵的转置
void main()
{
int i,j,temp
for(i=0
{
for(j=0
{
temp=A[i][j]
A[i][j] = A[j][i]
A[j][i] = temp
}
}
}
链式栈
初始化
void stkLink()
{
LS=malloc(sizeof(Node))
LS->next=NULL
}
判栈空
int emptystk(LKstk *LS)
{
if(LS->next==NULL) return 1
else return 0
}
进栈
void pushstk(LKstk *LS)
{
Node *temp
temp=malloc(sizeof(Node))
temp->next=LS->next
LS->next=temp
temp->data=x
}
出栈
void delete(LKstk *LS)
{
if(LS->next!=NULL)
{
Node *temp
temp=LS->next
LS->next=temp->next
free(temp)
}
}
取栈顶
int getTop(LKstk *LS)
{
if(LS->next!=NULL){
return LS->next->data
}
return NULLdata
}
链式队列
队列初始化
void inital(LKQue *LQ)
{
lkQueue *temp
temp=malloc(sizeof(node))
LQ->front=temp
LQ->rear=temp
(LQ->front)->next=NULL
}
判队列空
int emptyLKQue(LKQue *LQ)
{
if(LQ->rear==LQ->front)
return 1
else return 0
}
入队列
void enter(LKQue *LQ,DataType x)
{
LkQueue *temp
temp=malloc(sizeof(Node))
temp->data=x
temp->next=NULL
(LQ->rear)->next=temp
LQ->rear=temp
}
出队列
void pop(LKQue *LQ)
{
if(LQ->front != LQ->rear)
{
temp = LQ->front->next
LQ->front->next=temp->next
if(temp->next==NULL)
LQ->rear=LQ->front
free(temp)
}
}