数据结构复习总结

Posted 未定_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构复习总结相关的知识,希望对你有一定的参考价值。

线性表

1.统计单链表中结点的值小于给定值x的结点数

int Count(Linklist head)

    int c=0;
    Linklist p;
    p=head->next;
    while(p)
    
        if(p->data<x)
            c++;
        p=p->next;
    
    return c;

2.已知L1,L2分别为两循环单链表的头结点指针,m,n分别为L1,L2中数据结点个数,要求将两表合成一个带头结点的循环单链表

LinkList Union(LinkList L1,LinkList L2,int m,int n)

    if(m<0||n<0)
    
        cout<<"error";
        exit(0);
    
    if(m<n)
    
        if(m==0)
            return L2;
        else 
            LinkList p=L1;
            while(p->next!=L1)//因为是循环单链表
                p=p->next;//找最后一个结点
            p->next=L2->next;
            L2->next=L1->next;
            free(L1);
        
    
    else 
        if(n==0)
            return L1;
        else 
            Linklist p=L2;
            while(p->next!=L2.first)//因为是循环单链表
                p=p->next;
            p->next=L1->next;
            L1->next=L2->next;
            free(L2);
    

3.从有序表A中删除和有序表B中元素相同的结点

4.头插法与尾插法

LinkList::LinkList(int a[],int n)//头插法

    first=new Node;
    first->next=NULL;
    Node *s;
    for(int i=0;i<n;i++)
    
        s=new Node;
        s->data=a[i];
        s->next=first->next;
        first->next=s;
    

LinkList::LinkList(int a[],int n)//尾插法

    first=new Node;
    first->next=NULL;
    Node *s,*r=first;
    for(int i=0;i<n;i++)
    
        s=new Node;
        s->data=a[i];
        r->next=s;
        r=s;
    
    r->next=NULL;

5.基本操作
删除

LinkList::~LinkList()

    Node *p=first;
    while(first!=NULL)
    
        first=first->next;
        delete p;
        p=first;
    

求长度

LinkList::Length()

    int m=0;
    Node *p=first->next;
    while(p!=NULL)
    
        c++;
        p=p->next;
    
    return c;

获取第i个位置的数

int LinkList::Get(int i)

    Node *p=first->next;
    int c=1;
    while(p!=NULL&&c<i)
    
        p=p->next;
        c++;
    
    if(p==NULL)
        throw"查找位置错误";
    else return p->data;

获取数x的位置

int LinkList::Locate(int x)

    Node *p=first->next;
    int c=1;
    while(p!=NULL)
    
        if(p->data==x)
            return c;
        p=p->next;
        c++;
    
    return 0;//用于判断是否找到

插入

void LinkList::Insert(int i,int x)

    Node *p=first,*s=NULL;
    int c=0;
    while(p!=NULL&&c<i-1)
    
        p=p->next;
        c++;
    
    if(p==NULL)
        throw"插入位置错误";
    else
        s=new Node;
        s->data=x;
        s->next=p->next;
        p->next=s;
    

删除

int LinkList::Delete(int i)

    Node *p=first,*s=NULL;
    int x;
    while(p!=NULL&&c<i-1)
    
        p=p->next;
        c++;
    
    if(p==NULL||p->next==NULL)
        throw"删除位置错误";
    else
        s=p->next;
        p->next=s->next;
        x=s->data;
        delete s;
        return x;
    

6.构造有序双链表

void doublelink::Insert(int x)

    node *p=first->next,*s,*q=first;
    s=new node;
    s->data=x;
    s->next=NULL;
    while(p)
    
        if(p->data>=x)
        
            s->next=p;
            s->piror=q;
            q->next=s;
            p->piror=s;
            break;
        
        q=p;
        p=p->next;
    
    if(p==NULL)
    
        s->piror=q;
        s->next=q->next;
        q->next=s;
    

7.构造有序单链表

void LinkList::Insert(int x)

    node *p=first->next,*s,*r=first;
    s=new node;
    s->data=x;
    while(p&&x>p->data)
    
        r=p;
        p=p->next;
    
    s->next=p;
    r->next=s;

栈和队列

1.括号匹配
简单

#include<iostream>
using namespace std;

int main()

    string s;
    cin>>s;
    int t=0;
    for(int i=0; i<=s.length(); i++)
    
        if(s[i]=='(')
            t++;
        else if(s[i]==')')
            t--;
        if(t<0)
            break;
    
    if(t==0)
        cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;


复杂

void match(LinkStack &s,char ch[])

    char c;
    for(int i=0; ch[i]!=NULL; i++)
    
        switch(ch[i])
        
        case'(':
        case'[':
        case'':
            s.Push(ch[i]);
            break;
        case')':
        case']':
        case'':
            if(s.Empty())
            
                cout<<"多右括号"<<endl;
                return ;
            
            else
            
                c=s.GetTop();
                if(ch[i]==')'&&c=='('||ch[i]==']'&&c=='['||ch[i]==''&&c=='')
                
                    s.Pop();
                    break;
                
                else
                
                    cout<<"匹配失败"<<endl;
                    return ;
                
            
        
    
    if(s.Empty())
        cout<<"匹配成功"<<endl;
    else cout<<"多左括号"<<endl;

后缀表达式求值

#include<iostream>
#include<stack>
using namespace std;
stack<int>s;

int main()

    string str;
    int x,y;
    while(cin>>str)
    
        if(str=="+")
        
            x=s.top();
            s.pop();
            y=s.top();
            s.pop();
            s.push(x+y);
        
        else if(str=="-")
        
            x=s.top();
            s.pop();
            y=s.top();
            s.pop();
            s.push(y-x);
        
        else if(str=="*")
           x=s.top();
            s.pop();
            y=s.top();
            s.pop();
            s.push(x*y);
        
        else if(str=="/")
           x=s.top();
            s.pop();
            y=s.top();
            s.pop();
            s.push(y/x);
        
        else
        
            int n=0;
            for(int i=0; i<str.length(); i++)
            
                n=n*10+str[i]-'0';
            
            s.push(n);
        
    
    cout<<s.top()<<endl;
    return 0;

十进制转化为二进制

#include<iostream>
#include<stack>
using namespace std;

int main()

    int n;
    cin>>n;
    stack<int>s;
    while(n!=0)
    
        s.push(n&1);
        n>>=1;
    
    while(!s.empty())
       cout<<s.top();
        s.pop();
    
    return 0;

树和二叉树

1.前中后序遍历二叉树

void PreOrder(BiNode *root)

    if(root!=NULL)
    
        cout<<root->data;
        PreOrder(root->lchild);
        PreOrder(root->rchild);
    

void InOrder(BiNode *root)

    if(root!=NULL)
    
        InOrder(root->lchild);
        cout<<root->data;
        InOrder(root->rchild);
    

void PostOrder(BiNode *root)

    if(root!=NULL)
    
        PostOrder(root->lchild);
        PostOrder(root->rchild);
        cout<<root->data;
    

void PreOrder(int root,char data[])

    if(data[root]!='\\0')
    
        cout<<data[root];
        PreOrder(2*root,data);
        PreOrder(2*root+1,data);
    

void InOrder(int root,char data[])

    if(data[root]!='\\0')
    
        InOrder(2*root,data);
        cout<<data[root];
        InOrder(2*root+1,data);
    

void PostOrder(int root,char data[])

    if(data[root]!='\\0')
    
        PostOrder(2*root,data);
        PostOrder(2*root+1,data);
        cout<<data[root];
    

层序遍历

void BiTree::LeverOrder( )

    BiNode *Q[100],*q=NULL;//顺序队列最多100个结点
    int front=-1,rear=-1; //队列初始化
    if(root==NULL)
        return;
    Q[++rear]=root;//根指针入队
    while(front!=rear)//当队列非空时
    
        q=Q[++front];//出队
        cout<<q->data;
        if(q->lchild!=NULL)
            Q[++rear]=q->lchild;
        if(q->rchild!=NULL)
            Q[++rear]=q->rchild;
    


void BiTree::LevelOrder(BiNode *root)

    queue<BiNode*>a;
    if(root)
        a.push(root);
    while(!a.empty())
    数据库系统原理(复习总结)

JavaSE复习总结之集合(Collection)

数据结构复习总结

数据结构复习总结

数据结构复习总结

《数据库原理与应用》复习总结