数据结构整理
线性表的顺序存储结构
typedef struct {
int *elem;
int length;
int listsize;
}SqList;
bool InitList(SqList &L);
bool ListEmpty(SqList &L);
bool ListInsert(SqList &L,int i,int e);
int ListLength(SqList &L);
bool ListDelete(SqList &L,int i,int &e);
bool GetElem(SqList &L,int i,int &t);
void PrintList(SqList &L);
#include<stdio.h>
#include"SqList.h"
#include<stdlib.h>
#define LIST_INIT_SIZE 20
#define LISTINCREMENT 10
/*
操作目的:初始化顺序表
初始条件:无
操作结果:构造一个空的线性表
函数参数:SqList &L 待初始化的线性表
返回值:bool 操作是否成功
*/
bool InitList (SqList &L)
{
L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem)
return false;
L.length=0;
L.listsize=LIST_INIT_SIZE;
return true;
}
/*
操作目的:判断顺序表是否为空
初始条件:线性表已存在
操作结果:若L为空表,则返回true,否则返回false
函数参数:SqList &L 待判断的线性表
返回值:bool 是否为空
*/
bool ListEmpty(SqList &L)
{
if(L.length==0)
return true;
else
return false;
}
/*
操作目的:在顺序表的指定位置插入结点,插入位置i表示在第i个元素之前插入
初始条件:线性表L已存在,l<=i<=ListLength(L)+1
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加一
函数参数:SqList &L 线性表L
int i 插入位置
int e 待插入的数据元素
返回值:bool 操作是否成功
*/
bool ListInsert(SqList &L,int i,int e)
{
int *p,*q,*newbase;
if(i<1||i>L.length+1)
return false;
if(L.length>L.listsize)
{
newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
exit(0);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;p--)
*(p+1)=*p;
*q=e;
L.length++;
return true;
}
/*
操作目的:求线性表的长度
初始条件:线性表L已存在
操作结果:返回线性表的长度
函数参数:SqList &L 线性表L
返回值:int 线性表的长度
*/
int ListLength(SqList &L)
{
return L.length;
}
/*
操作目的:在顺序线性表L中删除第i个元素,并用e返回其值
初始条件:线性表L已存在
操作结果:若成功删除,则返回true,否则返回false ,e返回其值
函数参数:SqList &L 线性表L
int i 删除元素的位置
int e 存放被删除的元素
返回值:bool 操作是否成功
*/
bool ListDelete(SqList &L,int i,int &e)
{
int *p,*q;
if(i<1||i>L.length)
return false;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
L.length--;
return true;
}
/*
操作目的:取出顺序线性表L中第i个元素,并用e返回其值
初始条件:线性表L已存在,1<=i<=Listlength(L)
操作结果:若成功查找,则返回true,否则返回false ,e返回其值
函数参数:SqList &L 线性表L
int i 要取出元素的位置
int e 存放取出的元素
返回值:bool 操作是否成功
*/
bool GetElem(SqList &L, int i, int &t)
{
int *p;
if(i<1||i>ListLength(L))
return false;
p=&(L.elem[i-1]);
t=*p;
return true;
}
/*
操作目的:输出线性表中的所有元素
初始条件:线性表L已存在
操作结果:输出线性表中的所有元素
函数参数:SqList &L 线性表L
返回值:无
*/
void PrintList(SqList &L)
{
int *p,*q;
q=L.elem+L.length-1;
for(p=&(L.elem[0]);p<=q;p++)
{
printf("%d ",*p);
}
printf("\n");
}
#include<stdio.h>
#include"SqList.h"
int main()
{
SqList l;
if(InitList(l))
printf("初始化成功!\n");
if(ListEmpty)
printf("动态顺序表为空!\n");
else
printf("动态顺序表不为空!\n");
int n;
for(int i=1;i<=5;i++)
{
printf("请输入第%d个元素\n",i);
scanf("%d",&n);
if(ListInsert(l,i,n))
printf("第%d个元素插入成功!\n",i);
}
printf("线性表的长度为%d\n",ListLength(l));
int e;
if(ListDelete(l,3,e))
printf("第三个元素删除成功!\n");
else
printf("第三个元素删除失败!\n");
printf("线性表的长度为%d\n",ListLength(l));
int t;
if(GetElem(l,4,t))
printf("第4个元素为%d\n",t);
else
printf("取元素失败!\n");
printf("线性表中所有元素为:\n");
PrintList(l);
return 0;
}
线性表的链式存储结构
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
bool InitList(LinkList &L);
void CreatList(LinkList &L,int n);
bool ListEmpty(LinkList L);
bool ListInsert(LinkList &L, int i, ElemType e);
void Print(LinkList L);
bool ListDelete(LinkList &L, int i, ElemType &e);
int ListLength(LinkList L);
bool GetElem(LinkList L, int i, ElemType &e);
bool PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e);
bool NextElem(LinkList L, ElemType cur_e, ElemType &nxt_e);
void ClearList(LinkList &L);
#include<stdlib.h>
#include"LinkList.h"
#include<stdio.h>
bool InitList(LinkList &L)
{
L=(LNode *)malloc(sizeof(LNode));
if(L==NULL)
return false;
else
{
L->next=NULL;
return true;
}
}
bool ListEmpty(LinkList L)
{
if(L->next==NULL)
return true;
else
return false;
}
void CreatList(LinkList &L,int n)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LinkList p;
for(int i=n;i>0;i--)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
void Print(LinkList L)
{
LinkList p;
p=L;
p=p->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
bool ListInsert(LinkList &L, int i, ElemType e)
{
LinkList p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
return false;
LinkList s;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool ListDelete(LinkList &L, int i, ElemType &e)
{
LinkList p=L,q;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1)
return false;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return true;
}
int ListLength(LinkList L)
{
int length=0;
LinkList p=L;
p=p->next;
while(p)
{
length++;
p=p->next;
}
return length;
}
bool GetElem(LinkList L, int i, ElemType &e)
{
LinkList p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1)
return false;
p=p->next;
e=p->data;
return true;
}
bool PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e)
{
LinkList p,pre;
p=L;
pre=p;
p=p->next;
if(p->data==cur_e)
return false;
while(p&&p->data!=cur_e)
{
pre=p;
p=p->next;
}
if(p==NULL)
{
return false;
}
else
{
pre_e=pre->data;
}
return true;
}
bool NextElem(LinkList L, ElemType cur_e, ElemType &nxt_e)
{
LinkList p;
p=L;
p=p->next;
while(p&&p->data!=cur_e)
{
p=p->next;
}
if(p->next==NULL&&p->data==cur_e)
return false;
if(p==NULL)
{
return false;
}
else
{
nxt_e=p->next->data;
}
return true;
}
void ClearList(LinkList &L)
{
LinkList p=L,q;
p=p->next;
while(p)
{
q=p;
p=p->next;
free(q);
}
L->next=NULL;
}
#include<stdio.h>
#include"LinkList.h"
#include<stdlib.h>
int main()
{
LinkList L;
if(InitList(L))
printf("初始化成功!\n");
else
printf("初始化失败!\n");
if(ListEmpty(L))
printf("链表为空!\n");
else
printf("链表不为空!\n");
int n;
printf("请输入元素个数\n");
scanf("%d",&n);
printf("请逆序输入%d个元素\n",n);
CreatList(L,n);
printf("当前链表存入元素为:\n");
Print(L);
int i;
ElemType e;
int cur_e,pre_e;
printf("请输入当前元素:\n");
scanf("%d",&cur_e);
if(PriorElem(L,cur_e,pre_e))
{
printf("%d前的元素为%d\n",cur_e,pre_e);
}
else
{
printf("不存在%d这个元素,或此元素前无元素\n",cur_e);
}
int nxt_e;
printf("请输入当前元素:\n");
scanf("%d",&cur_e);
if(NextElem(L,cur_e,nxt_e))
{
printf("%d后的元素为%d\n",cur_e,nxt_e);
}
else
{
printf("不存在%d这个元素,或此元素无后继元素\n",cur_e);
}
ClearList(L);
printf("当前链表长度为:%d\n",ListLength(L));
Print(L);
return 0;
}
栈的顺序存储结构
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char SElemType;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
bool InitStack(SqStack &S);
bool Push(SqStack &S,SElemType e);
bool Pop(SqStack &S,SElemType &e);
bool StackEmpty(SqStack S);
int StackLength(SqStack S);
bool ClearStack(SqStack &S);
bool DestoryStack(SqStack &S);
bool visit(SElemType e);
void StackTraverse(SqStack &S);
void conversion(int n,int d);
bool judge(char ss[]);
int EvaluateExpression();
char GetTop(SqStack S);
bool In(char c);
int ops(char c);
char Precede(char a,char b);
char Operate(char a,char theta,char b);
#include"Stack.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef char SElemtype;
int EvaluateExpression()
{
SqStack optr;
SqStack opnd;
InitStack(optr);
Push(optr,'#');
InitStack(opnd);
char c,a,b,theta,x;
c=getchar();
while(c!='#'||GetTop(optr)!='#')
{
if(!In(c))
{
Push(opnd,c);
c=getchar();
}
else
switch (Precede(GetTop(optr),c))
{
case '<'://读入字符优先级高
Push(optr,c);
c=getchar();
break;
case '='://优先级一样
Pop(optr,x);
c=getchar();
break;
case '>'://读入字符优先级低
Pop(optr,theta);
Pop(opnd,b);
Pop(opnd,a);
Push(opnd,Operate(a,theta,b));
break;
}
}
return GetTop(opnd)-'0';
}
char GetTop(SqStack S)
{
if(S.top!=S.base)
return *(S.top-1);
}
bool In(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return true;
else
return false;
}
int ops(char c)
{
if(c=='+')
return 0;
if(c=='-')
return 1;
if(c=='*')
return 2;
if(c=='/')
return 3;
if(c=='(')
return 4;
if(c==')')
return 5;
if(c=='#')
return 6;
}
char Precede(char a,char b)
{
char cmp[8][8]={">><<<>>",">><<<>>",">>>><>>",">>>><>>","<<<<<= ",">>>> >>","<<<<< ="};
int i=ops(a);
int j=ops(b);
return cmp[i][j];
}
char Operate(char a,char theta,char b)
{
a-='0';
b-='0';
switch (theta)
{
case '+':
return a+b+'0';
case '-':
return a-b+'0';
case '*':
return a*b+'0';
case '/':
return a/b+'0';
}
}
bool InitStack(SqStack &S)
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
return false;
S.top=S.base;
S.stacksize = STACK_INIT_SIZE;
return true;
}
int StackLength(SqStack S)
{
return S.top-S.base;
}
bool Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)
return false;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top=e;
S.top++;
return true;
}
bool Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)
return false;
S.top--;
e=*S.top;
return true;
}
bool StackEmpty(SqStack S)
{
if(S.top==S.base)
return true;
else
return false;
}
bool ClearStack(SqStack &S)
{
while(!StackEmpty(S))
{
S.top--;
}
return true;
}
bool DestoryStack(SqStack &S)
{
while(!StackEmpty(S))
{
S.top--;
}
S.stacksize=0;
S.top=S.base=NULL;
return true;
}
bool visit(SElemType e)
{
printf("%d ",e);
return true;
}
void StackTraverse(SqStack &S)
{
if(StackEmpty(S))
{
printf("栈为空!\n");
return;
}
while(!StackEmpty(S))
{
visit(*(--S.top));
}
printf("\n");
}
#include<stdio.h>
#include"Stack.h"
int main()
{
printf("请输入一个表达式,并以#结束\n");
printf("表达式的结果为:%d\n",EvaluateExpression());
return 0;
}
队列的基本操作
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode ,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
bool InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
return false;
Q.front->next=NULL;
return true;
}
bool DestoryQueue(LinkQueue &Q)
{
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return true;
}
bool ClearQueue(LinkQueue &Q)
{
QueuePtr p,q;
p=Q.front->next;
Q.front->next=NULL;
while(p)
{
q=p->next;
free(p);
p=q;
}
Q.rear=Q.front;
return true;
}
bool QueueEmpty(LinkQueue Q)
{
if(Q.front->next==NULL)
return true;
else
return false;
}
int QueueLength(LinkQueue Q)
{
int cnt=0;
QueuePtr p=Q.front->next;
while(p)
{
cnt++;
p=p->next;
}
return cnt;
}
bool GetHead(LinkQueue Q,QElemType &e)
{
if(Q.front==Q.rear)
return false;
e=Q.front->next->data;
return true;
}
bool EnQueue(LinkQueue &Q,QElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
return false;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return true;
}
bool DeQueue(LinkQueue &Q,QElemType &e)
{
QueuePtr p;
if(Q.front==Q.rear)
return false;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return true;
}
void visit(QElemType e)
{
printf("%d ", e);
}
bool QueueTraverse(LinkQueue Q)
{
if(QueueEmpty(Q))
{
printf("队列为空!\n");
return false;
}
QueuePtr p;
p=Q.front->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
return true;
}
int main()
{
LinkQueue Q;
if(InitQueue(Q))
printf("初始化成功!\n");
else
printf("初始化失败!\n");
if(QueueEmpty(Q))
printf("当前队列为空!\n");
else
printf("当前队列不为空!\n");
printf("请输入入队数据的个数:\n");
int len;
scanf("%d",&len);
int a[100];
QElemType e;
printf("请输入这些数据:\n");
for(int i=0;i<len;i++)
{
scanf("%d",&a[i]);
EnQueue(Q,a[i]);
}
printf("此时队列长度为:%d\n",QueueLength(Q));
if(GetHead(Q,e))
printf("队头元素为:%d\n",e);
else
printf("队列为空!\n");
if(DeQueue(Q,e))
printf("队头元素%d删除成功!\n",e);
else
printf("队列为空!\n");
printf("当前队列:\n");
QueueTraverse(Q);
ClearQueue(Q);
DestoryQueue(Q);
return 0;
}
循环队列的基本操作
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXQSIZE 100
typedef int QElemType;
typedef struct{
QElemType *base;//初始化的动态分配内存空间
int front;//头指针,若队列不为空,指向队列头元素
int rear;//尾指针,若队列不空,指向队尾元素的下一个位置
}SqQueue;//循环队列的顺序存储结构
bool InitQueue(SqQueue &Q)//初始化
{
Q.base=(QElemType *)malloc(MAXQSIZE * sizeof(QElemType));//分配内存空间
if(!Q.base)//分配失败
return false;
Q.front=Q.rear=0;//初始头尾指针都指向0
return true;
}
int QueueLength(SqQueue Q)//求长度
{
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
bool EnQueue(SqQueue &Q,QElemType e)//在队尾插入
{
if((Q.rear+1)%MAXQSIZE==Q.front)//循环队列满了
return false;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;//指向下一个
return true;
}
bool DeQueue(SqQueue &Q,QElemType &e)//在队头删除
{
if(Q.front==Q.rear)
return false;
e=Q.base[Q.front];//存一下要删除的数
Q.front = (Q.front+1)%MAXQSIZE;
return true;
}
bool QueueEmpty(SqQueue Q)//判空
{
if(Q.rear==Q.front)
return true;
else
return false;
}
bool GetHead(SqQueue Q,QElemType &e)//取队头元素
{
if(Q.front==Q.rear)
return false;
e=Q.base[Q.front];
return true;
}
bool ClearQueue(SqQueue &Q)//清空队列
{
Q.front=Q.rear=0;
return true;
}
bool DestoryQueue(SqQueue &Q) //销毁队列
{
free(Q.base);
Q.front=0;
Q.rear=0;
return true;
}
void visit(QElemType e)
{
printf("%d ",e);
}
bool QueueTraverse(SqQueue Q)
{
if(QueueEmpty(Q))
{
printf("队列为空!\n");
return false;
}
int i=Q.front;
while(i!=Q.rear)
{
visit(Q.base[i]);
i=(i+1)%MAXQSIZE;
}
printf("\n");
return true;
}
int main()
{
SqQueue Q;
if(InitQueue(Q))//初始化队列
printf("初始化成功!\n");
else
printf("初始化失败!\n");
if(QueueEmpty(Q))
printf("当前队列为空!\n");
else
printf("当前队列不为空!\n");
printf("请输入入队数据的个数:\n");
int len;
scanf("%d",&len);
int a[100];
QElemType e;
printf("请输入这些数据:\n");
for(int i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<len;i++)
{
if(EnQueue(Q,a[i]))
printf("元素%d成功入队!\n",a[i]);
else
printf("入队失败!\n");
}
printf("当前队列:\n");
QueueTraverse(Q);
printf("此时队列长度为:%d\n",QueueLength(Q));
if(GetHead(Q,e))
printf("队头元素为:%d\n",e);
else
printf("队列为空!\n");
if(DeQueue(Q,e))
printf("队头元素%d删除成功!\n",e);
else
printf("队列为空!\n");
printf("当前队列:\n");
QueueTraverse(Q);
ClearQueue(Q);
DestoryQueue(Q);
return 0;
}
串
串的基本操作
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct{
char *ch;
int length;
}HString;
bool StrInit(HString &T)
{
T.ch=NULL;
T.length=0;
return true;
}
bool StrAssign(HString &T,char *chars)
{
if(T.ch)
free(T.ch);
char *c;
int i;
for(i=0,c=chars;*c;i++,c++);
if(!i)
{
T.ch=NULL;
T.length=0;
}
else
{
if(!(T.ch=(char *)malloc(i*sizeof(char))))
return false;
for(int j=0;j<=i-1;j++)
{
T.ch[j]=chars[j];
}
T.length=i;
}
return true;
}
bool StrInsert(HString &S,int pos,HString T)
{
if(pos<1||pos>S.length+1)
return false;
if(T.length)
{
if(!(S.ch=(char *)realloc(S.ch,(S.length+T.length)*sizeof(char))))
return false;
for(int i=S.length-1;i>=pos-1;i--)
S.ch[i+T.length]=S.ch[i];
for(int i=pos-1,j=0;j<T.length;i++,j++)
{
S.ch[i]=T.ch[j];
}
S.length+=T.length;
}
return true;
}
bool SubString (HString &Sub,HString S,int pos,int len)
{
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
return false;
if(Sub.ch)
free(Sub.ch);
if(!len)
{
Sub.ch=NULL;
Sub.length=0;
}
else
{
Sub.ch=(char *)malloc(len*sizeof(char));
for(int i=0,p=pos-1;i<len;i++,p++)
{
Sub.ch[i]=S.ch[p];
}
Sub.length=len;
}
return true;
}
bool StrDelete(HString &S,int pos,int len)
{
if(pos<1||pos+len>S.length||len<0)
return false;
for(int i=pos-1;i<S.length-len;i++)
{
S.ch[i]=S.ch[i+len];
}
S.length-=len;
return true;
}
bool Concat(HString &T,HString S1,HString S2)
{
if(T.ch)
free(T.ch);
if(!(T.ch=(char *)malloc((S1.length+S2.length)*sizeof(char))))
return false;
for(int i=0;i<S1.length;i++)
{
T.ch[i]=S1.ch[i];
}
T.length=S1.length+S2.length;
for(int i=S1.length,j=0;i<T.length;i++,j++)
{
T.ch[i]=S2.ch[j];
}
return true;
}
int StrCompare(HString S,HString T)
{
for(int i=0;i<S.length&&i<T.length;i++)
{
if(S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
}
return S.length-T.length;
}
void Print(HString S)
{
for(int i=0;i<S.length;i++)
printf("%c",S.ch[i]);
printf("\n");
}
int Index(HString S,HString T,int pos)
{
int i=pos-1;
int j=0;
while(i<S.length&&j<T.length)
{
if(S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j==T.length)
return i-T.length+1;
else
return 0;
}
int main()
{
HString S1;
StrInit(S1);
char a[9]="abcdefgh";
StrAssign(S1,a);
printf("当前串为:");
Print(S1);
HString A;
StrInit(A);
SubString(A,S1,2,3);
printf("串的第二个位置长度为3的子串为:");
Print(A);
HString B;
StrInit(B);
char b[4]="cde";
StrAssign(B,b);
int pos=Index(S1,B,1);
printf("子串%s的位置是%d\n",b,pos);
char c[3]="ef";
printf("删除子串%s后,字符串为:",c);
StrDelete(S1,5,2);
Print(S1);
HString S2,S3;
StrInit(S2);
StrInit(S3);
char d[4]="123";
char e[4]="456";
StrAssign(S2,d);
printf("串2为:");
Print(S2);
StrAssign(S3,e);
printf("串3为:");
Print(S3);
int ans=StrCompare(S2,S3);
if(ans>0)
printf("串2大于串3\n");
else if(ans<0)
printf("串2小于串3\n");
else
printf("串2等于串3\n");
HString T;
StrInit(T);
Concat(T,S2,S3);
printf("将串2和串3连接为:");
Print(T);
return 0;
}
串的朴素匹配算法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int Index(char s[],char t[],int pos)//返回子串T在主串S中第pos个字符之后的位置,不存在返回0
{
int i=pos-1;
int j=0;
while(s[i]!='\0'&&t[j]!='\0')
{
if(s[i]==t[j])
{
i++;
j++;//继续比较后面的字符
}
else//不相等,子串从头开始
{
i=i-j+1;//主串相比之前加一
j=0;
}
}
if(t[j]=='\0')
return i-j+1; //包含子串,输出位置
else
return 0;//不包含子串
}
int main()
{
char s[100],t[100];
printf("请输入主串:");
gets(s);
printf("请输入子串:");
gets(t);
int pos;
printf("请输入匹配的起始位置:");
scanf("%d",&pos);
int a=Index(s,t,pos);
if(a==0)
printf("主串%s不包含子串%s",s,t);
else
printf("主串%s包含子串%s",s,t);
return 0;
}
KMP
#include<stdio.h>
#include<string.h>
#define MAXSTRLEN 255
typedef char SString[MAXSTRLEN+1];
int next[MAXSTRLEN+1];
int Index_KMP(SString S,SString T,int pos)
{
int i=pos,j=1;
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
void get_next(SString T,int next[])
{
int j=1,k=0;
next[1]=0;
while(j<T[0])
{
if(k==0||T[j]==T[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
int main()
{
SString S,T;
printf("请输入主串:\n");
gets(S+1);
*S=strlen(S+1);
printf("请输入子串:\n");
gets(T+1);
*T=strlen(T+1);
printf("请输入开始匹配的位置:\n");
int pos;
scanf("%d",&pos);
pos=Index_KMP(S,T,pos);
printf("子串的位置:%d\n",pos);
return 0;
}
数组和稀疏矩阵
数组
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#define MAX_ARRAY_DIM 8
typedef int ElemType;
typedef struct {
ElemType *base;
int dim;
int *bounds;
int *constants;
}Array;
bool InitArray(Array &A,int dim,...)
{
int elemtotal,i;
if(dim<1||dim>MAX_ARRAY_DIM)
return false;
A.dim=dim;
A.bounds=(int *)malloc(dim*sizeof(int));
if(!A.bounds)
exit(0);
elemtotal = 1;
va_list ap;
va_start(ap,dim);
for(i=0;i<dim;i++)
{
A.bounds[i]=va_arg(ap,int);
if(A.bounds[i]<0)
return false;
elemtotal *=A.bounds[i];
}
va_end(ap);
A.base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
if(!A.base)
exit(0);
A.constants=(int *)malloc(dim * sizeof(int));
if(!A.constants)
exit(0);
A.constants[dim-1]=1;
for(i=dim-2;i>=0;i--)
A.constants[i]=A.bounds[i+1]*A.constants[i+1];
return true;
}
bool Locate(Array A,va_list ap,int &off)
{
off=0;
for(int i=0;i<A.dim;i++)
{
int ind=va_arg(ap,int);
if(ind<0||ind>=A.bounds[i])
return false;
off+=A.constants[i]*ind;
}
return true;
}
bool Assign(Array &A,ElemType e, ...)
{
int result;
va_list ap;
va_start(ap,e);
int off;
if((result=Locate(A,ap,off))<=0)
return result;
*(A.base+off)=e;
return true;
}
bool Value(Array A,ElemType &e, ...)
{
va_list ap;
bool result;
va_start(ap,e);
int off;
if((result = Locate(A,ap,off))<=0)
return result;
e=*(A.base+off);
return true;
}
int main()
{
Array A;
InitArray(A,3,2,3,4);
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
for(int k=0;k<4;k++)
{
Assign(A,i+j+k,i,j,k);
int value;
Value(A,value,i,j,k);
printf("a[%d][%d][%d]=%d\n",i,j,k,value);
}
}
}
return 0;
}
稀疏矩阵
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 12500
typedef int ElemType;
typedef struct
{
int i,j;
ElemType e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
bool InitTSMatrix(TSMatrix &M)
{
int m,n,t;
printf("请输入矩阵的行数,列数和非零元的个数:\n");
scanf("%d%d%d",&m,&n,&t);
printf("请输入非零元素所在的行、列值、以及此非零元素\n");
if(t>MAXSIZE||m<0||n<0)
return false;
for(int k=1;k<=t;k++)
{
scanf("%d%d%d",&M.data[k].i,&M.data[k].j,&M.data[k].e);
}
M.mu=m;
M.nu=n;
M.tu=t;
return true;
}
bool FastTransposeSMartix(TSMatrix M,TSMatrix &T)
{
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
int num[M.nu+1],cpot[M.nu+1];
if(T.tu)
{
int col;
for(col=1;col<=M.nu;col++)
num[col]=0;
for(int t=1;t<=M.tu;t++)
num[M.data[t].j]++;
cpot[1]=1;
for(col=2;col<=M.nu;col++)
cpot[col]=cpot[col-1]+num[col-1];
for(int p=1;p<=M.tu;p++)
{
col=M.data[p].j;
int 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]++;
}
}
return true;
}
int main()
{
TSMatrix M,T;
InitTSMatrix(M);
FastTransposeSMartix(M,T);
printf("转置后的矩阵为:\n");
printf("%5d%5d%5d\n",T.mu,T.nu,T.tu);
for(int k=1;k<=T.tu;k++)
{
printf("%5d%5d%5d\n",T.data[k].i,T.data[k].j,T.data[k].e);
}
}
树
二叉树
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
bool InitBiTree(BiTree &T)
{
T=NULL;
return true;
}
bool BiTreeEmpty(BiTree T)
{
if(T==NULL)
return true;
return false;
}
int TreeSize(BiTree T)
{
if(T==NULL)
return 0;
if(T->lchild==NULL&&T->rchild==NULL)
return 1;
return 1+TreeSize(T->lchild)+TreeSize(T->rchild);
}
void PrintTreeLeaf(BiTree T)
{
if(T)
{
if(T->lchild==NULL&&T->rchild==NULL)
{
printf("%c",T->data);
}
PrintTreeLeaf(T->lchild);
PrintTreeLeaf(T->rchild);
}
}
int TreeDepth(BiTree T)
{
if(T==NULL)
{
return 0;
}
if(T->lchild==NULL&&T->rchild==NULL)
{
return 1;
}
int dl=TreeDepth(T->lchild);
int dr=TreeDepth(T->rchild);
return 1+(dl>dr? dl:dr);
}
bool CreateBiTree(BiTree &T)
{
char ch;
scanf(" %c",&ch);
if(ch=='@')
T=NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
exit(0);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return true;
}
bool Visit(TElemType e)
{
printf("%c",e);
return true;
}
bool PreOrderTraverse(BiTree T)
{
if(T)
{
if(Visit(T->data))
{
if(PreOrderTraverse(T->lchild))
{
if(PreOrderTraverse(T->rchild))
return true;
}
}
return false;
}
else
return true;
}
bool InOrderTraverse(BiTree T)
{
if(T)
{
if(InOrderTraverse(T->lchild))
{
if(Visit(T->data))
{
if(InOrderTraverse(T->rchild))
return true;
}
return false;
}
return false;
}
else
return true;
}
bool PostOrderTraverse(BiTree T)
{
if(T)
{
if(PostOrderTraverse(T->lchild))
{
if(PostOrderTraverse(T->rchild))
{
if(Visit(T->data))
return true;
else
return false;
}
}
}
else
return true;
}
int main()
{
BiTree T;
InitBiTree(T);
if(BiTreeEmpty(T))
printf("树为空!\n");
else
printf("树不为空!\n");
printf("先序创建二叉树:\n");
CreateBiTree(T);
printf("二叉树的深度为:%d\n",TreeDepth(T));
printf("二叉树总结点个数为:%d\n",TreeSize(T));
printf("二叉树叶子结点为:\n");
PrintTreeLeaf(T);
printf("\n");
printf("二叉树的先序遍历序列为:\n");
PreOrderTraverse(T);
printf("\n");
printf("二叉树的中序遍历序列为:\n");
InOrderTraverse(T);
printf("\n");
printf("二叉树的后序遍历序列为:\n");
PostOrderTraverse(T);
printf("\n");
}
哈夫曼树
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char * * HuffmanCode;
void Select(HuffmanTree HT,int n,int &s1,int&s2)
{
int min=99999998,max=99999999;
s1=s2=0;
for(int i=1; i<=n;i++)
{
if(HT[i].parent==0)
{
if(HT[i].weight<min)
{
min=HT[i].weight;
s1=i;
}
}
}
int t=HT[s1].weight;
HT[s1].weight=max;
min=99999998;
for(int i=1; i<=n; i++)
{
if(HT[i].parent==0)
{
if(HT[i].weight<min)
{
min=HT[i].weight;
s2=i;
}
}
}
HT[s1].weight=t;
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int*w,int n)
{
if(n<=1)
return;
int m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
int i;
for(i=1;i<=n;i++)
{
HT[i].weight=w[i];
HT[i].parent=HT[i].rchild=HT[i].lchild=0;
}
for(;i<=m;i++)
{
HT[i].weight=HT[i].parent=HT[i].rchild=HT[i].lchild=0;
}
int s1=0,s2=0;
for(i=n+1;i<=m;i++)
{
Select(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
char *cd;
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
int start;
for(i=1;i<=n;++i)
{
start=n-1;
int c=0;
int f=0;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
{
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
}
HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
int main()
{
HuffmanTree HT;
HuffmanCode HC;
char c[100];
int n,i;
printf("请输入结点数目:\n");
scanf("%d",&n);
int a[100];
int *w;
w=a;
printf("输入%d个结点的权值: \n",n);
for(i=1;i<=n;i++)
{
printf("输入第%d结点的名称以及权值:",i);
scanf(" %c %d",&c[i],&a[i]);
}
w=a;
HuffmanCoding(HT,HC,w,n);
printf("哈夫曼编码的输出:\n");
for(i=1;i<=n;i++)
{
printf("%c:%s",c[i],HC[i]);
printf("\n");
}
return 0;
}
图的基本操作和prim算法最小生成树
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20
#define VRType int
#define IofoType int
#define VertexType int
#define Boolean bool
#define Max 100
#define Status int
Boolean visited[Max];
typedef int ElemType;
typedef enum {DG,DN,UDG,UDN} GraphKind;
typedef struct ArcCell
{
VRType adj;
IofoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
GraphKind kind;
}MGraph;
void (*VisitFunc)(MGraph G,int v);
void InitMGraph(MGraph &G)
{
for(int i=0;i<MAX_VERTEX_NUM;i++)
{
for(int j=0;j<MAX_VERTEX_NUM;j++)
{
if(G.kind==0||G.kind==2)
{
G.arcs[i][j].adj=0;
}
else
{
G.arcs[i][j].adj=INFINITY;
}
}
}
}
int LocateVex(MGraph G,int v)
{
for(int i=0;i<G.vexnum;i++)
{
if(G.vexs[i]==v)
return i;
}
return -1;
}
bool CreateGraph(MGraph &G)
{
printf("请输入图的类型标识(0:有向图 1:有向网 2:无向图 3:无向网):");
scanf("%d", &G.kind);
InitMGraph(G);
printf("请输入图G的顶点数和弧数:");
scanf("%d%d", &G.vexnum, &G.arcnum);
if (G.vexnum == 0 || G.arcnum == 0)
return false;
printf("请输入各个顶点的信息(将按照输入顺序建立顶点向量):\n");
for (int i=0; i<G.vexnum; ++i)
scanf("%d", &(G.vexs[i]));
printf("构造邻接矩阵\n");
for (int k=0; k<G.arcnum; ++k)
{
ElemType v1, v2;
int w;
printf("请输入第%d条弧的信息(弧尾顶点、弧头顶点、权值(若为无权图,则输入1)):\n",k+1);
scanf("%d%d%d", &v1, &v2, &w);
printf("v1=%d v2=%d w=%d\n",v1,v2,w);
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);
G.arcs[i][j].adj = w;
if (G.kind == 2 || G.kind == 3)
G.arcs[j][i].adj = w;
}
return true;
}
void Print(MGraph G)
{
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
{
if(G.kind==1||G.kind==3)
{
if(G.arcs[i][j].adj==INT_MAX)
printf("∞ ");
else
printf("%2d ",G.arcs[i][j].adj);
}
else printf("%2d ",G.arcs[i][j].adj);
}
printf("\n");
}
}
Status FirstAdjVex(MGraph G,int v)
{
for(int i=0;i<G.vexnum;i++)
{
if(G.arcs[v][i].adj!=0&&G.arcs[v][i].adj!=INFINITY)
{
return i;
}
}
return -1;
}
Status NextAdjVex(MGraph G,int v,int w)
{
for(int i=w+1;i<G.vexnum;i++)
{
if(G.arcs[v][i].adj!=0&&G.arcs[v][i].adj!=INFINITY)
return i;
}
return -1;
}
void Visit(MGraph G,int v)
{
printf("%d ",G.vexs[v]);
}
void DFS(MGraph G,int v)
{
visited[v]=true;
VisitFunc(G,v);
for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
{
if(!visited[w])
DFS(G,w);
}
}
void DFSTraverse(MGraph G)
{
VisitFunc = Visit;
for(int v=0;v<G.vexnum;v++)
visited[v]=false;
for(int v=0;v<G.vexnum;v++)
{
if(!visited[v])
DFS(G,v);
}
}
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode ,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
bool InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
return false;
Q.front->next=NULL;
return true;
}
bool QueueEmpty(LinkQueue Q)
{
if(Q.front->next==NULL)
return true;
else
return false;
}
bool EnQueue(LinkQueue &Q,QElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
return false;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return true;
}
bool DeQueue(LinkQueue &Q,QElemType &e)
{
QueuePtr p;
if(Q.front==Q.rear)
return false;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return true;
}
void BFSTraverse(MGraph G)
{
for(int v=0;v<G.vexnum;v++)
{
visited[v]=false;
}
LinkQueue Q;
InitQueue(Q);
for(int v=0;v<G.vexnum;v++)
{
if(!visited[v])
{
visited[v]=true;
Visit(G,v);
EnQueue(Q,v);
while(!QueueEmpty(Q))
{
int u;
DeQueue(Q,u);
for(int w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
{
if(!visited[w])
{
visited[w]=true;
Visit(G,w);
EnQueue(Q,w);
}
}
}
}
}
}
typedef struct
{
VertexType adjvex;
VRType lowcost;
}cd;
cd closedge[MAX_VERTEX_NUM];
int minimum(cd closedge[],MGraph G)
{
int mini, j;
for (j = 0; j < G.vexnum; j++)
{
if (closedge[j].lowcost != 0)
break;
}
mini = j;
for (j=j+1; j < G.vexnum; j++)
{
if ((closedge[j].lowcost < closedge[mini].lowcost)&&closedge[j].lowcost!=0)
{
mini = j;
}
}
return mini;
}
void MiniSpanTree_PRIM(MGraph G,VertexType u)
{
int k=LocateVex(G,u);
for(int j=0;j<G.vexnum;j++)
if(j!=k)
{
closedge[j].adjvex=u;
closedge[j].lowcost=G.arcs[k][j].adj;
}
closedge[k].lowcost=0;
for(int i=1;i<G.vexnum;i++)
{
k=minimum(closedge,G);
printf("%d->%d ",closedge[k].adjvex,G.vexs[k]);
closedge[k].lowcost=0;
for(int j=0;j<G.vexnum;j++)
if(G.arcs[k][j].adj<closedge[j].lowcost)
{
closedge[j].adjvex=G.vexs[k];
closedge[j].lowcost=G.arcs[k][j].adj;
}
}
}
int main()
{
MGraph G;
CreateGraph(G);
printf("邻接矩阵为:\n");
Print(G);
printf("深度优先遍历序列为:\n");
DFSTraverse(G);
printf("\n");
printf("广度优先遍历序列为:\n");
BFSTraverse(G);
printf("\n");
printf("prim算法最小生成树:\n");
printf("请输入最小生成树顶点:");
int u;
scanf("%d",&u);
MiniSpanTree_PRIM(G,u);
return 0;
}
查找
顺序表的查找
#include<stdio.h>
typedef int ElemType;
typedef int KeyType;
typedef struct{
ElemType elem[100];
int length;
}SSTable;
int Search_Seq(SSTable ST,KeyType key)
{
ST.elem[0]=key;
int i;
for(i=ST.length;ST.elem[i]!=key;i--);
return i;
}
int Search_Bin(SSTable ST,KeyType key)
{
int low=1,high=ST.length;
while(low<=high)
{
int mid=(low+high)/2;
if(ST.elem[mid]==key)
return mid;
else if(ST.elem[mid]>key)
high=mid-1;
else low=mid+1;
}
return 0;
}
int main()
{
KeyType key;
int t;
SSTable ST1;
printf("顺序表的查找:\n");
printf("请输入数据个数:");
scanf("%d",&ST1.length);
printf("请输入%d个数据\n",ST1.length);
for(int i=1;i<=ST1.length;i++)
scanf("%d",&ST1.elem[i]);
printf("请输入要查找的元素:\n");
scanf("%d",&key);
t=Search_Seq(ST1,key);
if(t)
printf("%d在顺序表的第%d个位置\n",key,t);
else
printf("表中不存在此元素\n");
SSTable ST2;
printf("有序表的折半查找\n");
printf("请输入数据个数:");
scanf("%d",&ST2.length);
printf("请有序输入%d个数据\n",ST2.length);
for(int i=1;i<=ST2.length;i++)
scanf("%d",&ST2.elem[i]);
printf("请输入要查找的元素:\n");
scanf("%d",&key);
t=Search_Seq(ST2,key);
if(t)
printf("%d在有序表的第%d个位置\n",key,t);
else
printf("表中不存在此元素\n");
return 0;
}
二叉排序树
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef int KeyType;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
bool SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p)
{
if(!T)
{
p=f;
return false;
}
else if(key==T->data)
{
p=T;
return true;
}
else if(key<T->data)
return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}
bool InsertBST(BiTree &T,ElemType e)
{
BiTree p;
if(!SearchBST(T,e,NULL,p))
{
BiTree s;
s=(BiTree)malloc(sizeof (BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if(!p)
T=s;
else if(e<p->data)
p->lchild=s;
else
p->rchild=s;
return true;
}
else return false;
}
bool Visit(int e)
{
printf("%d ",e);
return true;
}
bool InOrderTraverse(BiTree T)
{
if(T)
{
if(InOrderTraverse(T->lchild))
{
if(Visit(T->data))
{
if(InOrderTraverse(T->rchild))
return true;
}
return false;
}
return false;
}
else
return true;
}
int main()
{
BiTree T;
int a;
for(int i=0;i<6;i++)
{
scanf("%d",&a);
InsertBST(T,a);
}
printf("二叉排序树中序遍历结果为:\n");
InOrderTraverse(T);
return 0;
}
二叉排序树的判定
#include<stdio.h>
#include<stdlib.h>
#define true 1
#define false 0
typedef int datatype;
typedef struct node
{
datatype data;
struct node *lchild,*rchild;
}BiTNode, *BiTree;
int Min=-1;
bool CreateBiTree(BiTree &T)
{
datatype e;
scanf("%d",&e);
if(e==0)
T=NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
exit(0);
T->data=e;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return true;
}
void JudgeBST(BiTree T,int &flag)
{
if(T->lchild&&flag)
JudgeBST(T->rchild,flag);
if(T->data<Min)
flag=0;
Min=T->data;
if(T->rchild&&flag)
JudgeBST(T->lchild,flag);
}
int main()
{
BiTree T;
printf("先序建立一颗二叉树:\n");
CreateBiTree(T);
int flag=1;
JudgeBST(T,flag);
if(flag)
printf("此二叉树为二叉排序树。\n");
else printf("此二叉树不是二叉排序树。\n");
}
散列表插入和删除
bool Insert(int k)
{
int ant=hash(k);
LinkList p=HT[ant];
while(p->next)
{
if(p->next->data==k)
return false;
p=p->next;
}
LinkList s;
s=(LNode*)malloc(sizeof(LNode));
s->data=k;
s->next=p->next;
p->next=s;
return true;
}
bool Delete(int k)
{
int ant=hash(k);
LinkList p=HT[ant];
while(p->next)
{
if(p->next->data==k)
{
LinkList s=p->next;
p->next=s->next;
free(s);
return true;
}
p=p->next;
}
return false;
}
排序
#include<stdio.h>
#define MAXSIZE 20
typedef int KeyType;
typedef int InfoType;
typedef struct{
KeyType key;
InfoType otherinfo;
}RedType;
typedef struct{
RedType r[MAXSIZE+1];
int length;
}SqList;
void InsertSort(SqList &L)
{
int i,j;
for(i=2;i<=L.length;i++)
{
if(L.r[i].key<L.r[i-1].key)
{
L.r[0]=L.r[i];
L.r[i]=L.r[i-1];
for( j=i-2;L.r[0].key<L.r[j].key;j--)
L.r[j+1]=L.r[j];
L.r[j+1]=L.r[0];
}
}
}
void ShellInsert(SqList &L,int dk)
{
int i,j;
for(i=dk+1;i<=L.length;i++)
{
if(L.r[i].key<L.r[i-dk].key)
{
L.r[0]=L.r[i];
for(j=i-dk;j>0&&L.r[0].key<L.r[j].key;j-=dk)
L.r[j+dk]=L.r[j];
L.r[j+dk]=L.r[0];
}
}
}
void ShellSort(SqList &L,int dlta[],int t)
{
for(int k=0;k<t;k++)
ShellInsert(L,dlta[k]);
}
int Partition(SqList& L,int low,int high)
{
L.r[0]=L.r[low];
int pivotkey=L.r[low].key;
while(low<high)
{
while(low<high&&L.r[high].key>=pivotkey)
high--;
L.r[low]=L.r[high];
while(low<high&&L.r[low].key<=pivotkey)
low++;
L.r[high]=L.r[low];
}
L.r[low]=L.r[0];
return low;
}
void QSort(SqList &L,int low,int high)
{
if(low<high)
{
int pivoloc=Partition(L,low,high);
QSort(L,low,pivoloc-1);
QSort(L,pivoloc+1,high);
}
}
void QuickSort(SqList &L)
{
QSort(L,1,L.length);
}
int SelectMinkey(SqList &L,int i)
{
int min=L.r[i].key ,j;
int minp=i;
for( j=i+1;j<=L.length;j++)
{
if(L.r[j].key<min)
{
min=L.r[j].key;
minp=j;
}
}
return minp;
}
void SelectSort(SqList &L)
{
int i,j;
for(i=1;i<L.length;i++)
{
j=SelectMinkey(L,i);
if(j!=i)
{
RedType t;
t=L.r[j];
L.r[j]=L.r[i];
L.r[i]=t;
}
}
}
typedef SqList HeapType;
void HeapAdjust(HeapType &H,int s,int m)
{
RedType rc=H.r[s];
for(int j=2*s;j<=m;j*=2)
{
if(j<m&&H.r[j].key<H.r[j+1].key)
j++;
if(rc.key>=H.r[j].key)
break;
H.r[s]=H.r[j];
s=j;
}
H.r[s]=rc;
}
void HeapSort(HeapType &H)
{
int i;
for(i=H.length/2;i>0;i--)
{
HeapAdjust(H,i,H.length);
}
for(i=H.length;i>1;i--)
{
RedType t=H.r[1];
H.r[1]=H.r[i];
H.r[i]=t;
HeapAdjust(H,1,i-1);
}
}
void Input(SqList &L)
{
printf("请输入数据个数:");
scanf("%d",&L.length);
printf("请输入这些数据:\n");
for(int i=1;i<=L.length;i++)
{
scanf("%d",&L.r[i].key);
}
}
void Print(SqList L)
{
for(int i=1;i<=L.length;i++)
printf("%d ",L.r[i].key);
printf("\n");
}
int main()
{
SqList L;
printf("简单选择排序:\n");
Input(L);
SelectSort(L);
Print(L);
}