swust-数据结构OJ题库

数据结构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;

}

 

 

发布了24 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Wutongyewan/article/details/79591251