数据结构OJ题库
1、题目
AC代码:
#include<stdio.h>
/**
*有序顺序表的合并操作的实现
*/
#define MaxSize 50
//定义顺序表
struct Sqlist{
int data[MaxSize];
int length;
};
//非递减插入
void merge(Sqlist &L,Sqlist D,Sqlist R)
{
int i=0,j=0;
L.length=0;
//比较大小插入
while(i<D.length&&j<R.length)
{
if(D.data[i]<=R.data[j])
{
L.data[L.length] = D.data[i];
i++;
L.length++;
}
else
{
L.data[L.length] = R.data[j];
j++;
L.length++;
}
}
while(i<D.length)
{
L.data[L.length] = D.data[i];
i++;
L.length++;
}
while(j<R.length)
{
L.data[L.length] = R.data[j];
j++;
L.length++;
}
}
int main()
{
Sqlist A,B,C;
int n,m;
//完成数据的输入
scanf("%d",&A.length);
for(int i=0;i<A.length;i++)
scanf("%d",&A.data[i]);
scanf("%d",&B.length);
for(int i=0;i<B.length;i++)
scanf("%d",&B.data[i]);
merge(C,A,B);
for(int j=0;j<C.length;j++)
printf("%d ",C.data[j]);
printf("\n");
return 0;
}
2、题目
AC代码:
#include<stdio.h>
/**
*逆置顺序表
*/
#define MaxSize 50
//定义顺序表
struct Sqlist{
char data[MaxSize];
int length;
};
void ZhiHuan(Sqlist &L2,Sqlist L1)
{
//把L1的最后一个赋值给L2的第一个
int j=0;
L2.length=0;
for(int i=L1.length;i>0;i--)
{
L2.data[j] = L1.data[i];
j++;
L2.length++;
}
}
int main()
{
Sqlist L1,L2;
scanf("%d",&L1.length);
for(int i=0;i<=L1.length;i++)
{
scanf("%c",&L1.data[i]);
}
ZhiHuan(L2,L1);
//输出逆置顺序表
for(int i=0;i<L2.length;i++)
printf("%c ",L2.data[i]);
return 0;
}
3、题目
AC代码:
#include<stdio.h>
#define MaxSize 50
/**
*逆置顺序表
*/
struct Sqlist{
int data[MaxSize];
int length;
};
void ChaZhaoTihuan(Sqlist &L1,int item,int data)
{
int i=-1;//定义i用以记录查找元素的位置
//遍历顺序表查找item元素是否存在
for(int j=0;j<L1.length;j++)
{
if(L1.data[j]==item)
{
i=j;
break;//查找成功,退出循环
}
}
if(i!=-1)
{//在已有元素前添加data数据
for(int j=L1.length;j>=i;j--)
L1.data[j]=L1.data[j-1];
L1.data[i]=data;
L1.length++;//表长+1
}
else{//未查找到元素,在顺序表的末尾
L1.data[L1.length]=data;
L1.length++;//表长+1
}
}
int main()
{
Sqlist L1;
scanf("%d",&L1.length);
for(int i=0;i<L1.length;i++)
{
scanf("%d",&L1.data[i]);
}
int item;
int data;
scanf("%d",&item);
scanf("%d",&data);
ChaZhaoTihuan(L1,item,data);
for(int i=0;i<L1.length;i++)
printf("%d ",L1.data[i]);
return 0;
}
4、题目
AC代码:
#include<stdio.h>
#include<stdlib.h>
/*
*单链表的插入操作的实现
*/
typedef struct Sqlist{
int data;
struct Sqlist *next;
}Sqlist;
//创建单链表 ,完成插入前链表的数据输入工作
void CreatList(Sqlist *&L,int n)
{
Sqlist *s,*r;
L=(Sqlist *)malloc(sizeof(Sqlist));//头结点
r=L;
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);//输入一个数据,建立一个结点
s=(Sqlist *)malloc(sizeof(Sqlist));
s->data=a;
r->next=s;
r=s;
}
r->next=NULL;//尾结点置空
}
//输出单链表
void printList(Sqlist *L) {
Sqlist *r;
r=L->next;
while(r!=NULL) {
printf("%d ",r->data);
r=r->next;
}
}
void insertList(Sqlist *&L,int i,int data) {
int j=0;
Sqlist *p=L,*s;
if(i<0)//判断非法插入
{
printf("error!");
exit(0);
}
while(j<i-1&&p!=NULL) {
j++;
p=p->next;
}
if(p==NULL)//判断非法插入
{
printf("error!");
exit(0);
}
else {//在i-1位置插入结点
s=(Sqlist *)malloc(sizeof(Sqlist));//开辟新结点
s->data=data;//新结点的数据
s->next=p->next;//新结点指针指向p结点下一个指针域
p->next=s;//p结点指向新结点的指针
}
}
int main()
{
Sqlist *L;
int n,data,i;
scanf("%d",&n);
CreatList(L,n);
scanf("%d %d",&i,&data);
insertList(L,i,data);
printList(L);
return 0;
}
5、题目
AC代码:
#include<stdio.h>
#include<stdlib.h>
/*
*单链表的删除操作的实现
*/
typedef struct Sqlist{
int data;
struct Sqlist *next;
}Sqlist;
//创建单链表 ,完成链表的数据输入工作
void CreatList(Sqlist *&L,int n)
{
Sqlist *s,*r;
L=(Sqlist *)malloc(sizeof(Sqlist));//头结点
r=L;
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);//输入一个数据,建立一个结点
s=(Sqlist *)malloc(sizeof(Sqlist));
s->data=a;
r->next=s;
r=s;
}
r->next=NULL;//尾结点置空
}
//输出单链表
void printList(Sqlist *L) {
Sqlist *r;
r=L->next;
while(r!=NULL) {
printf("%d ",r->data);
r=r->next;
}
}
void deleateList(Sqlist *&L,int i,int n) {
int j=0;
Sqlist *p=L,*q;
if(i<1||i>=n)//判断是否非法删除结点 ,当i=1或i>5为非法删除
{
printf("error!");
exit(0);
}
//寻找结点
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}
if(p==NULL)
{
printf("error!");
exit(0);
}
else
{//删除i-1个结点
q=p->next;
p->next=q->next;
free(q);
n--;
}
}
int main()
{
Sqlist *L;
int n,i;
scanf("%d",&n);
CreatList(L,n);
scanf("%d",&i);
deleateList(L,i-1,n);
printList(L);
return 0;
}
6、题目
AC代码:
#include<stdio.h>
#include<stdlib.h>
/*
*单链表的链接
*/
typedef struct Sqlist{
char data;
struct Sqlist *next;
}Sqlist;
//创建单链表 ,完成链表的数据输入工作
void CreatList(Sqlist *&L,int n)
{
Sqlist *s,*r;
L=(Sqlist *)malloc(sizeof(Sqlist));//头结点
r=L;
for(int i=0;i<n;i++)
{
char a;
scanf("%c",&a);//输入一个数据,建立一个结点
s=(Sqlist *)malloc(sizeof(Sqlist));
//判断输入是否合法,如果没有这一句,程序会读入从键盘中输入的空格或者换行符你
while(a==' '||a=='\n')
{
scanf("%c",&a);
}
s->data=a;
r->next=s;
r=s;
}
r->next=NULL;//尾结点置空
}
//输出单链表
void printList(Sqlist *L) {
Sqlist *r;
r=L->next;
while(r!=NULL) {
printf("%c ",r->data);
r=r->next;
}
}
//链接两个单链表
void linkList(Sqlist *&L1,Sqlist *&L2)
{
Sqlist *p=L1;
//找到第一个链表的尾结点
while(p->next!=NULL)
{
p=p->next;
}
//把第一链表的尾结点指向第二个链表的头结点
p->next=L2->next;
//释放已经无用第二个链表的头结点
free(L2);
}
int main()
{
Sqlist *A,*B;
int n,m;
scanf("%d",&n);
CreatList(A,n);
scanf("%d",&m);
CreatList(B,m);
linkList(A,B);
printList(A);
return 0;
}
7、题目
AC代码:
#include<stdio.h>
#include<stdlib.h>
/*
*单链表上查找算法的实现
*/
typedef struct Sqlist{
int data;
struct Sqlist *next;
}Sqlist;
//创建单链表 ,完成链表的数据输入工作
void CreatList(Sqlist *&L,int n)
{
Sqlist *s,*r;
L=(Sqlist *)malloc(sizeof(Sqlist));//头结点
r=L;
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);//输入一个数据,建立一个结点
s=(Sqlist *)malloc(sizeof(Sqlist));
s->data=a;
r->next=s;
r=s;
}
r->next=NULL;//尾结点置空
}
void searchList(Sqlist *&L1,int n)
{
Sqlist *p=L1;
int j=1;//从第一个结点开始
int flag=0;
if(n<1)//判断是否是非法查找
{
printf("error");
exit(0);
}
//
while(p->next!=NULL)
{
if(n==j)
flag=1;
j++;
p=p->next;
}
if(flag==1)//查找成功
printf("ok");
else
printf("error");
}
int main()
{
Sqlist *A;
int n,i;
scanf("%d",&n);
CreatList(A,n);
scanf("%d",&i);
searchList(A,i);
return 0;
}
8、题目
AC代码:
#include<stdio.h>
#include<stdlib.h>
/*
*单链表-约瑟夫问题的实现
*/
typedef struct Sqlist{
int data;
struct Sqlist *next;
}Sqlist;
//创建单循环链表 ,完成链表的数据输入工作
void CreatList(Sqlist *&L,int n)
{
Sqlist *s,*r;
L=(Sqlist *)malloc(sizeof(Sqlist));//头结点
r=L;
for(int i=1;i<=n;i++)
{
s=(Sqlist *)malloc(sizeof(Sqlist));
s->data= i;
r->next=s;
r=s;
}
s->next=L->next;//尾结点指向头结点
}
void delList(Sqlist *&L1,int k,int n)
{
Sqlist *p=L1,*q;
int i,j;//从第1个结点开始
for(i=1;i<=n;i++)
{
for(j=1;j<k;j++)
p=p->next;//查找k时的结点
q=p->next;
p->next=q->next;
if(i==n)//输出最后一次循环时的数据
{
printf("%d",p->data);
break;
}
free(q);//把找到的对应结点释放掉
}
}
int main()
{
Sqlist *A;
int n,k;
scanf("%d",&n);
CreatList(A,n);
scanf("%d",&k);
delList(A,k,n);
return 0;
}
9、题目
AC代码:
#include<stdio.h>
#include<stdlib.h>
/*
*逆置单链表
*头插法的应用
*/
typedef struct Sqlist{
char data;
struct Sqlist *next;
}Sqlist;
//创建单链表 ,完成链表的数据输入工作
void CreatList(Sqlist *&L,int n)
{
Sqlist *s,*r;
L=(Sqlist *)malloc(sizeof(Sqlist));//头结点
L->next=NULL;
for(int i=1;i<=n;i++)
{
char a;
scanf("%c",&a);
s=(Sqlist *)malloc(sizeof(Sqlist));
while(a=='\n')
{
scanf("%c",&a);
}
s->data= a;
s->next=L->next;
L->next=s;
}
}
void printList(Sqlist *&L)
{
Sqlist *r;
r=L->next;
while(r!=NULL)
{
printf("%c ",r->data);
r=r->next;
}
}
int main()
{
Sqlist *A,*B;
int n;
scanf("%d",&n);
CreatList(A,n);
printList(A);
return 0;
}
10、题目
AC代码:
#include<stdio.h>
#include<stdlib.h>
/*
*双链表的操作问题
*/
typedef struct Dblist{
int data;
struct Dblist *prior;//左指针
struct Dblist *next;//右指针
}DLinkNode;
//创建一个双链表
void CreateList(DLinkNode *&L,int n,int a[])
{
DLinkNode *s,*r;
L=(DLinkNode *)malloc(sizeof(DLinkNode));
r=L;
for(int i=0;i<n-1;i++)
for(int j=n-1;j>i;j--)
{
if(a[j]<a[j-1])
{
int t;
t=a[j];a[j]=a[j-1];a[j-1]=t;
}
}
for(int i=0;i<n;i++){
s=(DLinkNode *)malloc(sizeof(DLinkNode));
s->data=a[i];//创建数据数据结点
r->next=s;s->prior=r;//把头结点的next指向新开辟的s结点
//把新开辟的s结点的prior指向头结点
r=s;//指针后移
}
r->next=NULL;//尾结点的next域置空
}
//打印双链表
void printList(DLinkNode *&L){
DLinkNode *p;
p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
DLinkNode *L;
int n,a[100];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
CreateList(L,n,a);
printList(L);
return 0;
}