前言:本文章的代码均为本人在学习过程中根据书上的代码所改的,主要也是为了应对考试,可能有的题用数组就完成了,发出去的初衷也是希望供同学们参考、学习(功德加11111……)关于链表,我认为只要掌握了前插法和尾插法并能灵活掌握,完成pta不是什么难题(它只是代码长了一点)
顺序表
7-1 顺序表的建立及遍历
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
if(i!=n-1)
cout<<a[i]<<" ";
else cout<<a[i];
}
}
7-2 jmu-ds-顺序表区间元素删除
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
int x,y;
cin>>x>>y;
bool flag=0;
for(int i=0;i<n;i++){
if((a[i]<x||a[i]>y)&&flag==1)
cout<<" "<<a[i];
else if(a[i]<x||a[i]>y){
flag=1;
cout<<a[i];
}
}
return 0;
}
7-3 数组循环左移
#include <iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<m;i++){
int a1=a[0];
for(int j=1;j<n;j++){
a[j-1]=a[j];
}
a[n-1]=a1;
}
cout<<a[0];
for(int i=1;i<n;i++){
cout<<" "<<a[i];
}
return 0;
}
7-4 jmu-ds-简单密码
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin,s);
if(s.size()==0)
cout<<"NULL";
for(int i=0;i<s.size();i++){
if(s[i]>='A'&&s[i]<='E')
s[i]+=21;
else if(s[i]>='F'&&s[i]<='Z')
s[i]-=5;
}
cout<<s;
}
7-5 递增有序顺序表的插入
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[100];
for(int i=0;i<n;i++){
cin>>a[i];
}
int x;
cin>>x;
a[n]=x;
sort(a,a+n+1);
for(int i=0;i<n+1;i++){
cout<<a[i]<<",";
}
return 0;
}
链表
7-6 单链表的创建及遍历
#include <iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
void CreatList_R(LinkList &L){
LNode *r,*p;
r=L;
int n;
cin>>n;
for(int i=0;i<n;i++){
p=new LNode;
cin>>p->data;
r->next=p;
r=p;
p->next=NULL;
}
}
void PrintList(LinkList &L){
LNode *p;
p=L->next;
while(p){
if(p->next!=NULL)
cout<<p->data<<" ";
else cout<<p->data;
p=p->next;
}
}
int main(){
LinkList L;
InitList(L);
CreatList_R(L);
PrintList(L);
return 0;
}
7-6 两个有序链表序列的合并
#include <iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
void CreatList_R(LinkList &L){
LNode *r,*p;
r=L;
int n;
cin>>n;
while(n!=-1){
p=new LNode;
p->data=n;
p->next=NULL;
r->next=p;
r=p;
cin>>n;
}
}
//尾插法
void MergeList_L(LinkList &la,LinkList &lb,LinkList &lc){
LNode *pa,*pb,*pc;
pa=la->next;
pb=lb->next;
lc=la;
pc=lc;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
delete lb;
}
int main(){
LinkList la,lb,lc;
InitList(la);
InitList(lb);
InitList(lc);
CreatList_R(la);
CreatList_R(lb);
MergeList_L(la,lb,lc);
LNode *p;
p=lc->next;
if(!p)cout<<"NULL";
while(p){
if(p->next!=NULL)
cout<<p->data<<" ";
else cout<<p->data;
p=p->next;
}
return 0;
}
7-7 两个有序链表序列的交集
#include <iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
void CreatList_R(LinkList &L){
LNode *r,*p;
r=L;
int n;
cin>>n;
while(n!=-1){
p=new LNode;
p->data=n;
r->next=p;
r=p;
p->next=NULL;
cin>>n;
}
}
void qiujiaoji(LinkList &la,LinkList &lb,LinkList &lc){
LNode *pa,*pb,*pc;
pa=la->next;
pb=lb->next;
pc=lc;
while(pa&&pb){
if(pa->data<pb->data)
pa=pa->next;
else if(pa->data>pb->data)
pb=pb->next;
else if(pa->data==pb->data){
pc->next=pa;//不用再创建结点了,否则内存会超限
pc=pa;
pa=pa->next;
pb=pb->next;
}
}
}
void PrintList(LinkList &L){
LNode *p;
p=L->next;
if(!p) cout<<"NULL";
while(p){
if(p->next!=NULL)
cout<<p->data<<" ";
else cout<<p->data;
p=p->next;
}
}
int main(){
LinkList la,lb,lc;
InitList(la);
InitList(lb);
InitList(lc);
CreatList_R(la);
CreatList_R(lb);
qiujiaoji(la,lb,lc);
PrintList(lc);
}
7-7 求链式线性表的倒数第K项
#include <iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
int CreatList_H(LinkList &L){
LNode *p;
int n;
cin>>n;
int cnt=0;
while(n!=-1&&n>=0){
cnt++;
p=new LNode;
p->data=n;
p->next=L->next;
L->next=p;
cin>>n;
}
return cnt;
}
void PrintList(LinkList &L,int cnt,int k){
LNode *p;
p=L->next;
if(k>cnt) cout<<"NULL";
int count=0;
while(p){
count++;
if(count==k){
cout<<p->data;
break;
}
p=p->next;
}
}
int main(){
int k;
cin>>k;
LinkList L;
InitList(L);
int cnt=CreatList_H(L);
PrintList(L,cnt,k);
return 0;
}
7-8 链表倒数n个结点的乘积
#include <iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
void CreaList_H(int n,LinkList &L){
LNode *p;
for(int i=0;i<n;i++){
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
void PrintList(LinkList &L,int cnt){
int chengji=1;
if(cnt==0)
cout<<0;
else{
LNode *p;
p=L->next;
for(int i=0;i<cnt;i++){
chengji*=p->data;
p=p->next;
}
cout<<chengji;
}
}
int main(){
int n;
cin>>n;
int cnt;
cin>>cnt;
LinkList L;
InitList(L);
CreaList_H(n,L);
PrintList(L,cnt);
return 0;
}
7-9 在有序链表中插入数据
#include <iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
int InitList(LinkList &L){
L=new LNode;
L->next=NULL;
return 1;
}
void CreatList_R(int n,LinkList &L){
LNode *r,*p;
r=L;
for(int i=0;i<n;i++){
p=new LNode;
int x;
cin>>x;
p->data=x;
r->next=p;
r=p;
p->next=NULL;
}
}
void InsertList(LinkList &L,int num){
LNode *p,*s;
s=new LNode;
s->data=num;
p=L;
while(p){
if(p->next==NULL){
p->next=s;
p=s;
s->next=NULL;
break;
}
else if(p->next->data==num) break;
else if(p->next->data>num){
s->next=p->next;
p->next=s;
break;
}
p=p->next;
}
}
void PrintList(LinkList &L){
LNode *p;
p=L->next;
while(p){
if(p->next!=NULL)
cout<<p->data<<" ";
else cout<<p->data;
p=p->next;
}
}
int main(){
int n;
cin>>n;
LinkList l;
InitList(l);
CreatList_R(n,l);
int num;
cin>>num;
InsertList(l,num);
PrintList(l);
return 0;
}
二分查找
7-12 二分查找
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int arr[n];
for(int i=0;i<n;i++){
cin>>arr[i];
}
int x;
cin>>x;
int cnt=1;
int index;
for(int i=0,j=n-1;;cnt++){
index=(i+j)/2;
if(x==arr[index]){
cout<<index<<endl<<cnt;
break;
}
else if(x>arr[index]){
i=index+1;
}
else if(x<arr[index]){
j=index-1;
}
if(i>j){
cout<<-1<<endl<<cnt;
break;
}
}
}
7-13 二分查找
#include <iostream>
using namespace std;
int erfenchazhao(int arr[],int x,int n){
int index;
for(int i=0,j=n-1;;){
index=(i+j)/2;
if(arr[index]==x){
return index;
break;
}
else if(arr[index]<x)
i=index+1;
else if(arr[index]>x)
j=index-1;
if(i>j) break;
}
}
int main(){
int n,m;
cin>>n>>m;
int arr[n],b[m];
for(int i=0;i<n;i++){
cin>>arr[i];
}
for(int i=0;i<m;i++){
cin>>b[i];
}
for(int i=0;i<m;i++){
if(i!=m-1)
cout<<erfenchazhao(arr,b[i],n)<<" ";
else cout<<erfenchazhao(arr,b[i],n);
}
}}
堆栈
#include <iostream>
#include <string>
using namespace std;
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
char InitStack(SqStack &S,int m){
S.base=new char[m];
if(!S.base) return 0;
S.top=S.base;
S.stacksize=m;
return 1;
}
char Push(SqStack &S,char &e){
if(S.top-S.base==S.stacksize) return 0;
*S.top++=e;
return 1;
}
char Pop(SqStack &S,char &e){
if(S.top==S.base) return 0;
e=*--S.top;
return 1;
}
bool islegal(string s,int m){
SqStack stack;
InitStack(stack,m);
for(int i=0;i<s.size();i++){
if(s[i]=='S'){
if(!Push(stack,s[i]))
return false;
//else Push(stack,s[i]);
}
else if(s[i]=='X'){
if(!Pop(stack, s[i]))
return false;
//else Pop(stack, s[i]);
}
else return false;
}
if(stack.top!=stack.base)
return false;
return true;
}
int main(){
int n,m;
string s;
cin>>n>>m;
getchar();
for(int i=0;i<n;i++){
getline(cin,s);
bool flag=islegal(s,m);
if(flag)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
括号匹配
#include <bits/stdc++.h>
#define maxsize 1000
using namespace std;
typedef struct{
char *top;
char *base;
int stacksize;
}Sqstack;
int InitStack(Sqstack &s){
s.base=new char[maxsize];
if(!s.base) return 0;
s.top=s.base;
s.stacksize=maxsize;
return 1;
}
char Push(Sqstack &s,char e){
if(s.top-s.base==s.stacksize) return 0;
*s.top++=e;
return 1;
}
char Pop(Sqstack &s){
if(s.top==s.base) return 0;
char e=*--s.top;
return e;
}
bool isMeet(char ch1,char ch2){
char arr[3]={'(','[','{'};
if(ch1==arr[0]&&ch2==')')
return true;
else if(ch1==arr[1]&&ch2==']')
return true;
else if(ch1==arr[2]&&ch2=='}')
return true;
else return false;
}
int main(){
string str;
getline(cin,str);
Sqstack s;
InitStack(s);
int left=0,right=0;
bool flag=true;
for(int i=0;str[i];i++){
if(str[i]=='('||str[i]=='['||str[i]=='{'){
left++;
Push(s,str[i]);
}
else if(str[i]==')'||str[i]==']'||str[i]=='}'){
right++;
char result=Pop(s);
flag=isMeet(result,str[i]);
}
}
if(s.top!=s.base)
flag=false;
cout<<left<<" "<<right<<endl;
if(flag)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
7-16 字符串对称
#include <bits/stdc++.h>
#define MAXSIZE 1000
using namespace std;
typedef struct{
char *top;
char *base;
int stacksize;
}Sqstack;
int InitStack(Sqstack &s){
s.base=new char[MAXSIZE];
if(!s.base) return 0;
s.top=s.base;
s.stacksize=MAXSIZE;
return 1;
}
char Push(Sqstack &s,char e){
if(s.top-s.base==s.stacksize) return 0;
*s.top++=e;
return 1;
}
char Pop(Sqstack &s){
if(s.top==s.base) return 0;
char e=*--s.top;
return e;
}
int main(){
string str;
getline(cin,str);
Sqstack s;
InitStack(s);
bool flag=true;
int l=str.size();
for(int i=0;i<l/2;i++){
Push(s,str[i]);
}
for(int i=l/2+l%2;i<l;i++){
if(str[i]!=Pop(s))
flag=false;
if(flag==false) break;
}
if(flag)
cout<<"yes";
else cout<<"no";
}
7-17 数据结构考题 十进制转换为二进制
#include <bits/stdc++.h>
#define MAXSIZE 100
using namespace std;
typedef struct{
int *top;
int *base;
int stacksize;
}Sqstack;
int InitStack(Sqstack &s){
s.base=new int[MAXSIZE];
if(!s.base) return 0;
s.top=s.base;
s.stacksize=MAXSIZE;
return 1;
}
int Push(Sqstack &s,int e){
if(s.top-s.base==s.stacksize) return 0;
*s.top++=e;
return 1;
}
int Pop(Sqstack &s){
if(s.top==s.base) return 0;
int e=*--s.top;
return e;
}
int main(){
int n;
cin>>n;
Sqstack s;
InitStack(s);
while(n){
Push(s,n%2);
n/=2;
}
while(s.top!=s.base){
cout<<Pop(s);
}
return 0;
}
7-18 数据结构考题 十进制转换为八进制
#include <bits/stdc++.h>
#define MAXSIZE 1000
using namespace std;
typedef struct{
int *base;
int *top;
int stacksize;
}Sqstack;
int InitStack(Sqstack &s){
s.base=new int[MAXSIZE];
if(!s.base) return 0;
s.top=s.base;
s.stacksize=MAXSIZE;
return 1;
}
int Push(Sqstack &s,int e){
if(s.top-s.base==s.stacksize) return 0;
*s.top++=e;
return 1;
}
int Pop(Sqstack &s){
if(s.top==s.base) return 0;
int e=*--s.top;
return e;
}
int main(){
int n;
cin>>n;
Sqstack s;
InitStack(s);
while(n){
Push(s,n%8);
n/=8;
}
while(s.base!=s.top){
cout<<Pop(s);
}
return 0;
}
7-19 队列操作
#include <iostream>
using namespace std;
class MyQueue{
int Size=0;
int num[1000000];
public:
void Push(int x){
num[Size++]=x;
}
int Pop(){
return num[--Size];
}
int size(){
return Size;
}
};
int main(){
int n;
cin>>n;
int operate;
MyQueue mq;
for(int i=0;i<n;i++){
cin>>operate;
switch(operate){
case 1:{
int x;
cin>>x;
mq.Push(x);
break;
}
case 2:{
if(mq.size()==0)
cout<<"Invalid"<<endl;
else cout<<mq.Pop()<<endl;
break;
}
case 3:{
cout<<mq.size()<<endl;
break;
}
}
}
return 0;
}