数据结构复习总结
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())
root=a.front(数据库系统原理(复习总结)