int SubSeq(LinkList A, LinkList B) {//10
//请在下面编写代码
/********************Begin********************/
LinkList pre = A;
LinkList p = pre->next;
LinkList q = B->next;
while(p && q)
{
if(p->val == q->val)
{
p = p->next;
q = q->next;
}
else{
pre = pre->next;
p = pre->next;
q = B->next;
}
}
if(q == NULL)
return true;
else
return false;
/*********************End*********************/
}
//1
#include "sqlist.h" //声明顺序表的类型
//整体建立顺序表
void CreateList(SqList *&L, ElemType a[], int n)
{
L = (SqList *)malloc(sizeof(SqList));
for (int i = 0; i < n; i++)
L->data[i] = a[i];
L->length = n;
}
//初始化线性表
void InitList(SqList *&L)
{
L = (SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间
L->length = 0;
}
//输出线性表
void DispList(SqList *L)
{
for (int i = 0; i < L->length; i++)
printf("%c ", L->data[i]);
printf("\n");
}
//插入第i个元素
bool ListInsert(SqList *&L, int i, ElemType e)
{
//请在下面输入代码
/******************************Begin/******************************/
int n=0;
for(n=L->length;n>=i;n--){
L->data[n]=L->data[n-1];}
L->data[i-1]=e;
++L->length;
/******************************Begin/******************************/
}
//删除第i个元素
bool ListDelete(SqList *&L, int i, ElemType &e)
{
//请在下面输入代码
/******************************Begin/******************************/
int n=0;
for(n=i;n<L->length;n++){
L->data[n-1]=L->data[n];
}L->length--;
/******************************Begin/******************************/
}
//7
#include <stdio.h>
#include <stdlib.h>
const int MAXSIZE = 3010; //循环队列最大容量
typedef int ElemType; //循环队列元素类型
ElemType Q[MAXSIZE]; //数组模拟循环队列
int front, rear; //队首、队尾指针
//初始化循环队列
void InitQueue()
{
front = rear = 0;
}
//判循环队列是否为空,空返回true;非空返回false
bool EmptyQueue()
{
return front == rear;
}
//判循环队列是否满,满返回true,不满返回false
bool FullQueue()
{
return (rear + 1) % MAXSIZE == front;
}
//入队列操作:先把队尾指针加1,然后把元素放入队尾指针指示的位置
void EnQueue(ElemType e)
{
if (FullQueue())
{
return; //队列已满,无法入队
}
Q[rear] = e;
rear = (rear + 1) % MAXSIZE;
}
//出队列操作:把队首指针加1
void DeQueue()
{
if (EmptyQueue())
{
return; //队列为空,无法出队
}
front = (front + 1) % MAXSIZE;
}
//取队首元素
ElemType GetQueue()
{
if (EmptyQueue())
{
return -1; //队列为空,无队首元素
}
return Q[front];
}
//求解约瑟夫环问题
void josephus(int n, int m)
{
InitQueue(); //初始化循环队列
//将1到n依次入队
for (int i = 1; i <= n; i++)
{
EnQueue(i);
}
while (!EmptyQueue())
{
//找到第m个人
for (int i = 0; i < m - 1; i++)
{
//将前m-1个人依次出队并重新入队
ElemType frontElem = GetQueue();
DeQueue();
EnQueue(frontElem);
}
//将第m个人出队
ElemType josephusElem = GetQueue();
DeQueue();
printf("%d", josephusElem);
if (!EmptyQueue())
{
printf(" ");
}
}
printf("\n");
}
int main(int argc, char* argv[])
{
int n, m;
scanf("%d %d", &n, &m);
josephus(n, m);
return 0;
}
//3
LinkNode *p=L->next->next,*q;
L->next->next=NULL;
while(p!=NULL){
q=L;
while(q->next!=NULL&&q->next->data<p->data)q=q->next;
LinkNode *r=q->next;
q->next=p;
p=p->next;
q->next->next=r;
}
//4
// 比较L1和L2的第一个结点的数据,将较小的结点赋值给L,并将对应的指针后移一位
if (L1->data <= L2->data) {
L = L1;
L1 = L1->next;
}
else {
L = L2;
L2 = L2->next;
}
// 将p指向L的第一个结点
p = L;
// 循环遍历L1和L2,直到其中一个为空为止
while (L1 != NULL && L2 != NULL) {
// 比较L1和L2的当前结点的数据,将较小的结点链接到p的后面,并将对应的指针后移一位
if (L1->data <= L2->data) {
p->next = L1;
L1 = L1->next;
}
else {
p->next = L2;
L2 = L2->next;
}
// 将p指向下一个结点
p = p->next;
}
// 如果L1不为空,则将其链接到p的后面
if (L1 != NULL) {
p->next = L1;
}
// 如果L2不为空,则将其链接到p的后面
if (L2 != NULL) {
p->next = L2;
}
//5
//初始化顺序栈
void InitStack(SqStack *&s)
{
//请在下面编写代码
/**************************************Begin**************************************/
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
/***************************************End**************************************/
}
//销毁顺序栈
void DestroyStack(SqStack *&s)
{
//请在下面编写代码
/**************************************Begin**************************************/
free(s);
/***************************************End**************************************/
}
//判断栈空否
bool StackEmpty(SqStack *s)
{
//请在下面编写代码
/**************************************Begin**************************************/
return (s->top==-1);
/***************************************End**************************************/
}
//进栈
bool Push(SqStack *&s, ElemType e)
{
//请在下面编写代码
/**************************************Begin**************************************/
if(s->top==MaxSize-1){
return false;
}
s->top++;
s->data[s->top]=e;
return true;
/***************************************End**************************************/
}
//出栈
bool Pop(SqStack *&s, ElemType &e)
{
//请在下面编写代码
/**************************************Begin**************************************/
if(s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;
/***************************************End**************************************/
}
//取栈顶元素
bool GetTop(SqStack *s, ElemType &e)
{
//请在下面编写代码
/**************************************Begin**************************************/
if(s->top==-1)
return true;
/***************************************End**************************************/
}
/**
* 判断给出的括号表达式是否匹配:匹配返回true;不匹配返回false
*/
bool is_valid(char* str)
{
//请在下面编写代码
/*************************Begin*********************/
int len = strlen(str);
int pos = 0;
int* ans = (int*)malloc(sizeof(int)*len);
for (int i = 0; i < len; i++)
{
if ((str[i] == '(') || (str[i] == '{') || (str[i] == '['))
{
ans[pos++] = str[i];
}
if (str[i] == ')')
{
if ('(' == ans[pos - 1])
{
pos--;
}
else
{
return false;
}
}
if (str[i] == '}')
{
if ('{' == ans[pos - 1])
{
pos--;
}
else
{
return false;
}
}
if (str[i] == ']')
{
if ('[' == ans[pos - 1])
{
pos--;
}
else
{
return false;
}
}
}
if (pos != 0)
{
return false;
}
return true;
/**************************End**********************/
}
//6
LinkNode *p=head,*q=NULL;
while(head!=q){
p=head;
while(q!=p->next){
p=p->next;
}
printf("%d ",p->data);
q=p;
}
//8
ListNode* deleteNode(ListNode* head, int val) {
//请在下面编写代码
/********************Begin********************/
if (!head) {
return NULL; // 空链表,直接返回
}
if (head->val == val) {
ListNode* temp = head;
head = head->next;
free(temp); // 删除头结点
return head;
}
ListNode* prev = head;
ListNode* curr = head->next;
while (curr) {
if (curr->val == val) {
prev->next = curr->next;
free(curr); // 删除当前节点
break;
}
prev = curr;
curr = curr->next;
}
return head;
/*********************End*********************/
}
//9
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef int DataType; //元素数据类型
const int MAXN = 100001; //队列最大容量
//循环队列类型定义
typedef struct {
DataType data[MAXN];
int head; //队首指针
int tail; //队尾指针
int MaxSize; //队列最大容量
}
SqQueue;
//初始化一个空的循环队列:(1)设置队列最大容量,(2)设置队首、队尾指针
void InitQueue(SqQueue* &Q, int capacity) {
//请在下面编写代码
/**********************Begin**********************/
Q = (SqQueue * ) malloc(sizeof(SqQueue));
Q -> head = Q -> tail = 0;
Q -> MaxSize = capacity;
/***********************End***********************/
}
//判队列是否为空
int QueueEmpty(SqQueue * Q) {
//请在下面编写代码
/**********************Begin**********************/
return Q->head == Q->tail ? 1 : 0;
/***********************End***********************/
}
//判队列是否满
int QueueFull(SqQueue * Q) {
//请在下面编写代码
/**********************Begin**********************/
return (Q->tail + 1) % Q->MaxSize == Q->head ? 1 : 0;
/***********************End***********************/
}
//入队列操作
void Push(SqQueue* &Q, DataType e) {
//请在下面编写代码
/**********************Begin**********************/
Q->tail = (Q->tail + 1) % Q->MaxSize;
Q->data[Q->tail] = e;
/***********************End***********************/
}
//删除队首元素:队首元素存入变量e
void Pop(SqQueue * & Q, DataType & e) {
//请在下面编写代码
/**********************Begin**********************/
Q->head = (Q->head + 1) % Q->MaxSize;
e = Q->data[Q->head];
/***********************End***********************/
}
//取队首元素,存入变量e
void GetHead(SqQueue * & Q, DataType & e) {
//请在下面编写代码
/**********************Begin**********************/
e = Q->data[(Q->head + 1)%Q->MaxSize];
/***********************End***********************/
}
//主函数
int main() {
int n, q;
scanf("%d %d", & n, & q); //输入队列容量、询问次数
SqQueue * Q; //声明循环队列Q
//循环队列,里面最多放置n个元素,循环队列容量为n+1
InitQueue(Q, n + 1);
//请在下面编写代码
/**********************Begin**********************/
while (q--) {
int e = 0;
char op[10];
scanf("%s", op);
switch (op[1]) {
case 'u':
scanf("%d", & e);
if (QueueFull(Q)) {
printf("full\n");
} else {
Push(Q, e);
}
break;
case 'o':
if (QueueEmpty(Q)) {
printf("empty\n");
} else {
Pop(Q, e);
printf("%d\n", e);
}
break;
case 'r':
if (QueueEmpty(Q)) {
printf("empty\n");
} else {
GetHead(Q, e);
printf("%d\n", e);
}
break;
}
}
/***********************End***********************/
return 0;
}
数据结构与算法
发布于 2023-11-19 119 次阅读
Comments NOTHING