数据结构基础算法整理

//结构化程序设计规定的三种基本控制结构是 顺序、选择、循环
//顺序栈---------------------------------------------------------
#define StackSize 100//假定栈分配的栈控件最多为100个元素
typedef char DataType;//假定栈元素的数据类型为字符
typedef struct{
    DataType data[StackSize];
    int top;
}SeqStack;

//置空栈
void InitStack(SeqStack *S)
{
    S->top=-1;
}
//判栈空
int StackEmpty(SeqStack *S)
{
    return S->top==-1;
}
//判栈满
int StackFull(SeqStack *S)
{
    return S->top==S->StackSize-1;
}
//进栈
void Push(SeqStack *S,DataType x)
{
    if(StackFull(s))
    {
        Error("Stack overflow");//上溢,退出运行
    }
    S->data[++S->top]=x;//栈顶指针加1后将x进栈
}
//退栈
DataType Pop(Seqstack *S)
{
    if(StackEmpty(S))
    {
        Error("Stack underflow");//下溢,退出运行
    }
    return S->data[S->top--];
}
//取栈顶元素
DataType StackTop(SeqStack *S)
{
    if(StackEmpty(S))
    {
        Error("Stack is empty");
    }
    return S->data[S->top];
}

//链栈------------------------------------------------
typedef struct stacknode{
    DataType data;
    struct stacknode *next;
}StackNode;
typedef struct{
    StackNode *top;//栈顶指针
}LinkStack;

void InitStack(LinkStack *S)
{
    S->top=NULL;
}

int StackEmpty(LinkStack *S)
{
    return S->top == NULL;
}

void Push(LinkStack *S,DataType x)
{
    //将元素x插入链栈头部
    StackNode *p=(StackNode *)malloc(sizeof(StackNode));
    p->data=x;
    p->next=S->top;//将新结点*p插入链栈头部
    S->top==p;
}

DataType Pop(ListStack *S)
{
    DataType *x;
    StackNode *p=S->top;    //保存栈顶指针
    if(StackEmpty(S))
    {
        Error("Stack underflow");    //下溢
    }
    x=p->data;        //保存栈顶结点数据
    S->top=p->next;//将栈顶结点从链下摘下
    free(p);        //释放原栈顶结点空间
    return x;
}

DataType StackTop(ListStack *S)
{
    if(StackEmpty(S))
    {
        Error("stack is empty");
    }
    return S->top->data;
}
//循环队列--------------
#define QueueSize 100    //应根据具体情况定义该值
typedef char DataType;    //DataTYpe的类型依赖于具体应用
typedef Sturet{
    int front;        //头指针,队非空时指向队头元素
    int rear;        //尾指针,队非空时指向队尾元素的下一位置
    int count;        //计数器,记录队中元素总数
    DataType data[QueueSize]
}CirQueue;

//置空队
void InitQueue(CirQueue *Q)
{
    Q->front=Q->rear=0;
    Q->count=0;        //计数器置0
}
//判队空
int QueueEmpty(CirQueue *Q)
{
    return Q->count==0;        //队列无元素为空
}
//判队满
int QueueFull(CirQueue *Q)
{
    return Q->count==QueueSize;    //队中元素个数等于QueueSize时队满
}
//入队
void EnQueue(CirQueue *Q,DataTye x)
{
    if(QueueFull(Q))
    {
        Error("Queue overflow");
    }
    Q->count++;
    Q->data[Q->rear]=x;
    Q->rear=(Q->rear+1)%QueueSize;    //循环意义下将尾指针加1
}
//出队
DataType DeQueue(CirQueue *Q)
{
    DataType temp;
    if(QueueEmpty(Q))
    {
        Error("Queue underflow");    //队空下溢
    }
    temp=Q->data[Q->front];
    Q->count--;
    Q->front=(Q->front+1)%QueueSize;    //循环意义下的头指针加1
    return temp;
}
//取队头元素
DataType QueueFront(CirQueue *Q)
{
    if(QueueEmpty(Q))
    {
        Error("Queue is empty.");
    }
    return Q->data[Q->front];
}
//链队列--------------------------------------------
typedef struct queuenode{
    DataType data;
    struct queuenode * next;
}QueueNode;
typedef struct{
    QueueNode * front;    //队头指针
    QueueNode * rear;    //队尾指针
}LinkQueue;

void InitQueue(LinkQueue *Q)
{
    Q->front=NULL;
    Q->rear=NULL;
}
int QueueEmpty(LinkQueue *Q)
{
    return Q->front==NULL&&Q->rear==NULL;
    //实际上只需判队头指针是否为空即可
}
void EnQueue(LinkQueue *Q,DataType x)
{
    //将元素x插入链队列尾部
    QueueNode *p=(QueueNode *)malloc(sizeof(QueueNode));    //申请新结点
    p->data=x;
    p->next=NULL;
    if(QueueEmpty(Q))
    {
        Q->front=Q->rear=p;
    }
    else{
        //x插入非空队列的尾
        Q->rear->next=p;    //*p链到原队尾结点后
        Q->rear=p;            //队尾指针指向新的尾
    }
}

DataType DeQueue(LinkQueue *Q)
{
    DataType x;
    QueueNode *p;
    if(QueueEmpty(Q))
    {
        Error("Queue underflow");    //下溢
    }
    p=Q->front;        //指向队头结点
    x=p->data;        //保存队头结点的数据
    Q->front=p->next;    //    将队头结点从链下摘下
    if(Q->rear==p)    //原队中只有一个结点,删去后队列变空,此时队头指针已为空
    {
        Q->rear=NULL;
    }
    free(p);        //释放被删队头结点
    return x;    //返回队头数据
}

//二叉树链式存储结构----------------------------------
typedef char DataType;        //应由用户定义DataType的实际类型
typedef struct node{
    DataType data;
    Struct node * lchild,rchild;    //左右孩子指针
}BinTNode;    //结点类型
typedef BinTNode * BinTree;

//中序遍历二叉树
void Inorder(BinTree T)
{
    if(T)
    {
        Inorder(T->lchild);
        printf("%c",T->data);    //访问结点
        Inorder(T->rchild);
    }
}

//构造二叉树链表
void CreateBinTree(BinTree * T)
{
    //T是指向跟指针的指针,故修改*T就修改了实参(跟指针)本身
    char ch;
    if((ch=getchar())==' ')
    {
        *T=NULL;    //读入空格,将相应指针置空        
    }
    else{
        //读入非空格
        *T=(BinTNode *)malloc(sizeof(BinTNode));    //生成结点
        (*T)->data=ch;
        CreateBinTree(&(*T)->lchild);    //构造左子树
        CreateBinTree(&(*T)->rchild);    //构造右子树
    }
}

//201404带头结点单链表L中删除数据值最小的结点??
void f34(LinkList L)
{
    ListNode *p,*pre;  //*pre指向删除数据值的前一个结点
    if(L->next==NULL)return;
    pre=L;
    p=L->next;
    while(p->next!=NULL)
    {
        if(pre->next->data > p->next->data)
        {
            pre=p;
        }
        p=p->next;
    }
    p=pre->next;
    pre->next=p->next;
    free(p);
}

typedef struct node{
    int data;
    struct node *next;
}ListNode;
typedef ListNode *List_ptr;
//201410单链表逆转
List_ptr InvertList(List_ptr head)    //原地逆转单链表head
{
    List_ptr middle,p;
    middle=head->next;            //middle指向待反序链表的第一个结点
    head->next=NULL:
    while(middle!=NULL){
        p=middle;                //p指向待处理链表中的第一个结点
        middle=middle->next;    //middle指向待处理链表的下一个结点
        p->next=head->next;        //将p所指结点插入到链头
        head->next=p;
    }
    return head;
}


//201510顺序表冒泡降序排序    key    otherinfo    RecType
int f34(SeqList R,int n)
{
    int i,j,flag;
    for(i=1;i<n;i++){
        flag=0;
        for(j=1;j<=n-i;j++)
        {
            if(R[j]->key<R[j+1]->key)
            {
                flag=1;
                R[0]=R[j];
                R[j]=R[j+1];
                R[j+1]=R[0];
            }
            if(flag=0) return 0;
        }
    }
    return 0;
}

//201610判定单链表L是否是斐波那契序列,是返回1,否返回0,L中结点数不少于2
//f0=0,f1=1,fn=(fn-1)+(fn-2)
int IsF(List_ptr head)
{
    ListNode *pre1=head->next,*pre2=head->next->next,*current=pre2->next;
    if(pre1->data!=0||pre2->data!=1)return 0;
    while(current!=NULL)
    {
        if(current->data==pre1->data+pre2->data)
        {
            pre1=pre2;
            pre2=current;
            current=current->next;
        }
        else break;
    }
    if(current==NULL)return 1;
    else return 0;
}
//201704//返回二叉树T中数据域的值大于或等于x的结点的个数
int SearchXNum(BinTree *T,int x)
{
    int sum;
    if(T==NULL) return 0;
    if(T->data>=x)sum=1;
    else sum=0;
    return sum+SearchXNum(T->lchild,x)+SearchXNum(T->rchild,x);
}

//201710转换镜像二叉树
void f34(BinTree T)
{
    BinNode *temp;
    if(T)
    {    
        temp=T->lchild;
        T->lchild=T->rchild;
        T->rchild=temp;
        f34(T->lchild);
        f34(T->rchild);
    }
}
//201810 n个单链表表头指针保存在数组A中
//多链表查找值为key的数据元素,查找成功返回1,查找失败返回0
int f34(SeqList A,int n,int key)
{
    int i;
    Node *p;
    for(i=0;i<n;i++)
    {
        p=A[i];
        while(p!=NULL)
        {
            if(p->data==key)return 1;
            p=p->next;
        }
    }
    return 0;
}

//顺序表查找算法    平均查找长度:(n+1)/2
int SeqSearch(Seqlist R,KeyType K)
{
    //在顺序表R[1..n]中顺序查找关键字为K的结点
    //成功时返回找到的结点位置,失败时返回0
    int i;
    R[0].key=K;//设置哨兵
    for(i=n;R[i].key!=K;i--);//从表后往前找
    return i;//若i为0,表示查找失败,否则R[i]是要找的结点
}

//矩阵转换
#define MAX 100
typedef struct{
    int i,j;        //非零元素的行号、列号(下标)
    int v;            //非零元素值
}TriTupleNode;
typedef struct{
    TriTupleNode data[MAX];        //存储三元组的数组
    int m,n,t;                    //矩阵的行数、列数和非零元素的个数
}TSMatrix;                        //稀疏矩阵类型
//稀疏矩阵转换,列转换成行
int f31(TSMatrix a,TSMatrix *b)    //返回1表示出错,0表示正确
{
    //a和*b分别是矩阵M、T的三元组表,T为稀疏矩阵M的转置
    int p,q,col;    //col列    ?p    ?q
     b->m=a.n;b->n=a.m;
    b->t=a.t;//非零元总数
    if(b->t<0)return 1;
    else{
        q=0;
        for(col=0;col<a.n;++col)//对A的每一列
        {
            for(p=0;p<a.t;++p)//扫描A的三元组表
            {
                if(a.data[p].j==col)//找到列号为col的三元组
                {
                    b->data[q].i=a->data[p].j;
                    b->data[q].j=a->data[p].i;
                    b->data[q].v=a.data[p].v;
                    ++q;
                }
            }
        }
    }
    return 0;
}

//带头结点双链表,将值为x新结点插入*p之前,设p!=NULL
void DInsertBefore(DListNode *p,DataType x)
{
    DlistNode * s=malloc(sizeof(DListNode));
    s->data=x;
    s->prior=p->prior;
    s->next=p;
    p->prior->next=s;
    p->prior=s;
}

 

posted @ 2019-11-08 16:21  晓月圆舞  阅读(267)  评论(0)    收藏  举报