2023期中考试

1. 2023春期中机考第一题 顺序表(7+8 = 15分)
#include <stdio.h>
​
#include <stdlib.h>
​
#define OK 1
​
#define ERROR 0
​
​
​
typedef struct
​
{
​
    int *elem;
​
    int length;
​
    int listsize;
​
} sqlist;
​
​
​
//初始化一个空的顺序表
​
int initlist(sqlist *l)
​
{
​
    l->elem = (int *)malloc(100 * sizeof(int));
​
    if (!l->elem)
​
        return ERROR;
​
    l->length = 0;
​
    l->listsize = 100;
​
    return OK;
​
}
​
​
​
//根据长度为n的数组x,创建顺序表L   
​
//如果成功返回OK,否则返回ERROR
​
int insertlist(sqlist *l, int a[], int n)
​
{
    int i; 
    for (i = 0; i < n; i++)
​
    {
​
        l->elem[i] = a[i];
​
    }
​
    l->length = n;
​
    return OK;
​
}
​
​
​
//将顺序表a中大于t的元素存入顺序表b中
​
void getb(sqlist *b, sqlist a, int t)
​
{
​
    //★★★请补全代码
    int i = 0,j = 0;
    for(;i < a.length;i ++)
    {
        if(a.elem[i] > t)   
        {
            b->elem[j + b->length] = a.elem[i]; 
            j ++;
        }
    } 
    b->length += j;
​
​
​
​
​
​
​
}
​
​
​
// 将b中的元素逆置,并打印输出逆置后b中所有元素
​
void  reverselist(sqlist *b)
​
{
​
    //★★★请补全代码
    int i = 0;
    for(;i * 2 < b->length;i ++)
    {
        int temp = b->elem[i];
        b->elem[i] = b->elem[b->length - i - 1];
        b->elem[b->length - i - 1] = temp;      
    }
​
}
​
​
​
int main()
​
{
​
    sqlist a,b;
​
    initlist(&a);
​
    initlist(&b);
​
    int x[100];
​
    int n,i;
​
    scanf("%d", &n);
​
    for (i = 0; i < n; i++)
​
    {
​
        scanf("%d", &x[i]);
​
    }
​
    insertlist(&a, x, n);
​
    int t;
​
    scanf("%d", &t);
​
    getb(&b, a, t);
​
    reverselist(&b);
    
    for(i = 0;i < b.length;i ++)
    {
        printf("%d ",b.elem[i]);
    }
​
    return 0;
​
}
 
2. 2023春期中机考第二题 链表(5+7+8=20分)
#include <stdio.h>
​
#include <stdlib.h>
​
#define ERROR -1
​
#define OK 1
​
​
​
typedef struct Lnode
​
{
​
    int data;
​
    struct Lnode *next;
​
}LNode,*LinkList;
​
​
​
// 创建带头结点的单链表
​
int CreateList(LinkList *L)
​
{
​
    *L=(LinkList)malloc(sizeof(LNode));
​
    if((*L)==NULL)
​
    {
​
        printf("Memory failure\n");
​
        return ERROR;
​
    }
​
    (*L)->next=NULL;
​
    LinkList r;
​
    r=*L;
​
    int x;
​
    int i;
​
    for(i=0; ; i++)
​
    {
​
        scanf("%d",&x);
​
        if(x==-1)
​
        break;
​
        LNode *p=(LinkList)malloc(sizeof(LNode));
​
        if(!p) 
​
        {
​
            printf("Initialization failure");
​
            return ERROR;
​
        }
​
        p->data=x;
​
        p->next= NULL;
​
        r->next=p;
​
        r=p;
​
    }
​
    return OK;
​
}
​
​
​
//打印单链表
​
void ListPrint(LinkList L)
​
{
​
    LNode *p;
​
    for(p=L->next;p!=NULL;p=p->next)
​
    {
​
        printf("%d ",p->data);
​
    }
​
}
​
​
​
//求单链表长度
​
int ListLength(LinkList L)
​
{
​
    //★★★请补全代码
    int len = 0;
     LinkList p = L->next;
     while(p)
     {
        len ++;
        p = p->next;
     }
    return len;
​
​
​
​
​
​
}
​
​
​
//删除单链表的倒数第x个元素, 参数length为单链表长度,
​
//如果操作成功,返回OK,否则返回ERROR
​
int DeleteX(LinkList  *L,int length, int x)
​
{
    
    if(x > ListLength(*L))
    {
        printf("\nThe x value is not valid");
        return 0;
    }
​
    //★★★请补全代码
    int i = 0;
    LinkList p = (*L);
    while(p->next && i < length - x)
    {
        p = p->next;
        i ++;
    }
    LinkList s = p->next;
    p->next = s->next;
    free(s);
    return OK;
​
​
​
​
​
​
​
}
​
​
​
//单链表元素求和,并将累加和添加到单链表尾部
​
//如果操作成功,返回OK,否则返回ERROR
​
int AppendSumToList(LinkList *L)
​
{
​
    //★★★请补全代码
    int sum = 0;
    LinkList p = (*L);
    while(p->next)
    {
        sum += p->next->data;
        p = p->next;
    }
    LinkList s;
    s = (LinkList)malloc(sizeof(LNode));
    if(!s)  return ERROR;
    s->data = sum;
    s->next = NULL;
    p->next = s;
    return 1;
    
​
​
​
​
​
​
} 
​
​
​
int main()
​
{
​
    int length;
​
    int x;
​
    LinkList L;
​
    CreateList(&L);
​
    scanf("%d",&x);
    
​
​
    printf("The original linked list is:");
​
    ListPrint(L);
​
    printf("\nThe length of list is:");
​
    length=ListLength(L);
​
    printf("%d ",length);
    
​
​
    DeleteX (&L,length, x);
​
    printf("\nAfter deleting the element, the linked list is: ");
​
    ListPrint(L);
​
    printf("\nAfter inserting the sum, the new list is: ");
​
    AppendSumToList(&L);
​
    ListPrint(L);
​
    return 0;
​
}

3. 2023春期中机考第三题 链队列(7+8=15分)
#include <stdio.h>
​
#include <stdlib.h>
​
#define OK 1
​
#define ERROR 0
​
#define OVERFLOW 0
​
​
​
typedef char ElemType;
​
typedef int Status;
​
typedef struct QNode
​
{
​
    ElemType data;
​
    struct QNode *next;
​
}QNode,*queuePtr;   
​
​
​
typedef struct
​
{
​
    queuePtr front; //指向链队列的头
​
    queuePtr rear;  //指向链队列的尾 
​
}LinkQueue;
​
​
​
//队列初始化
​
Status InitQueue(LinkQueue *q)
​
{
​
   q->front=q->rear=(queuePtr)malloc(sizeof(QNode));  //创建头节点 头指针指向头节点
​
   if(!q->front)  //创建失败
​
   {
​
       return ERROR;
​
   }
​
   q->front->next=NULL;
​
   return OK;
​
}
​
​
​
//判断队列是否为空
​
Status QueueEmpty(LinkQueue Q)
​
{
​
    if(Q.front==Q.rear)
​
        return OK;
​
    else
​
        return ERROR;
​
}// QueueEmpty
​
​
​
int QueueLength (LinkQueue Q)
​
{
​
    int i;
​
    queuePtr p;
​
    p = Q.front->next;   //p指向队头
​
    i=1;
​
    while(p!=Q.rear)  //遍历链队列,统计结点数
​
    {
​
        i++;
​
        p=p->next;
​
    }
​
    return i;
​
}// QueueLength
​
​
​
//获得队首元素
​
Status GetHead(LinkQueue q,ElemType *e)
​
{
​
    if(q.front == q.rear)
​
        return ERROR;
​
    *e = q.front->next->data;
​
    return OK;
​
}
​
​
​
//入队
​
Status EnQueue(LinkQueue *q,ElemType e)
​
{
​
    queuePtr p=(queuePtr)malloc(sizeof(QNode)); //为新元素分配空间
​
    if(!p) return ERROR; 
​
    p->data=e;
​
    p->next=NULL;
​
    q->rear->next=p; //为尾指针的next重新赋值 将元素插入表尾
​
    q->rear=p;  //重新定位尾指针
​
    return OK;
​
}
​
​
​
//删除元素
​
Status DeQueue(LinkQueue *q,ElemType *e)
​
{
​
    if(q->front == q->rear) return ERROR; //此时队列为空
​
    queuePtr p = q->front->next;  
​
    *e=p->data;  //删除是队首元素
​
    q->front->next=p->next;
​
    if(q->rear == p)
​
        q->rear=q->front;
​
    free(p);
​
    return OK;
​
}
​
​
​
//清空链队列,如果成功,返回OK,否则返回ERROR
​
Status ClearQueue (LinkQueue *Q)
​
{
​
    //★★★请补全代码
    if(!Q->front)   return ERROR;
    free(Q->front);
    Q->front = Q->rear = 0;
    return OK; 
​
​
​
​
​
​
​
}// ClearQueue
​
​
​
//输出队列
​
Status PrintQueue(LinkQueue q)
​
{
​
    queuePtr p;
​
    p = q.front->next;
​
    while(p)
​
    {
​
        printf("%c ",p->data);
​
        p=p->next;
​
    }
​
    return OK;
​
}
​
​
​
//解密游戏
​
void DecryptGame(LinkQueue *Q)
​
{
​
    //★★★请补全代码
    LinkQueue S;
    InitQueue(&S);
    
    while(!QueueEmpty(*Q))
    {
        char temp;
        DeQueue(Q,&temp);
        EnQueue(&S,temp);
        if(!QueueEmpty(*Q))
        {
            DeQueue(Q,&temp);
            EnQueue(Q,temp);
        }
    } 
​
    PrintQueue(S);
​
 
​
​
​
}
​
​
​
int main()
​
{
​
    LinkQueue Q;
​
    InitQueue(&Q);
​
    int i;
​
    char a;
​
    for(i=0;i<10;i++)
​
    {
​
        scanf("%c",&a);
​
        EnQueue(&Q,a);
​
    }
​
    DecryptGame(&Q);
​
    printf("\n");
​
    ClearQueue(&Q);
​
    return 0;
​
}

4. 2023春 期中考试 第四题 顺序栈(5+10=15分)
#include<stdio.h>
​
#include<stdlib.h>
​
#define OK 1
​
#define ERROR 0
​
#define OVERFLOW -2
​
#define MAXSIZE  100
​
​
​
typedef int Status;
​
typedef int SElemType;
​
typedef struct{
​
    SElemType *base;
​
    SElemType *top;
​
    int stacksize;
​
}SqStack;
​
​
​
//顺序栈的初始化
​
Status InitStack(SqStack *S){ 
​
    S->base = (SElemType *)malloc(MAXSIZE * sizeof(SElemType));
​
    if(!S->base)
​
        return ERROR;
​
    S->top = S->base;
​
    S->stacksize = MAXSIZE;
​
    return OK;
​
}
​
​
​
Status Push(SqStack *S,SElemType e)
{
​
    //★★★请补全代码
    if(S->top - S->base >= S->stacksize)    return ERROR;
    *(S->top ++) = e;
    return OK;
​
​
}
​
​
​
//顺序栈的出栈
​
Status Pop(SqStack *S,SElemType *e){
​
    if(S->base == S->top)
​
        return ERROR;
​
    *e = *(--S->top);
​
    return OK;
​
}
​
​
​
​
​
// 将一个十进制数转换为二进制数,并打印输出
​
// 要求使用堆栈来实现,如果未用堆栈,答题无效
​
​
​
int main()
​
{
​
    //★★★请补全代码
    int n;
    scanf("%d",&n);
    if(n <= 0)
    {
        printf("Input error!");
        return 0;
    }
    
    SqStack S;
    InitStack(&S);
    
    while(n)
    {
        int x = n%2;
        Push(&S,x);
        n = (n - x) / 2;
    }
    
    while(S.base != S.top)
    {
        int e;
        Pop(&S,&e);
        printf("%d",e);
    }
    return 0;
}
​
 

5. 2023春 期中考试 第五题 字符串 (7+8=15分)
#include <stdio.h>   
​
#include <stdlib.h>   
​
​
​
#define ERROR 0
​
#define OK 1
​
#define TRUE 1
​
#define FALSE 0
​
#define MAXSIZE 20
​
​
​
typedef struct
​
{
​
    char *ch;       //若串非空,则按串长分配存储区
​
    int  length;    //串长度
​
}HString;
​
​
​
int InitString(HString *T) 
​
{
​
    T->ch=(char*)malloc(sizeof(char)*MAXSIZE);
​
    if(!T->ch)
​
        return ERROR;
​
    T->length=0;
​
    return OK;
​
}
​
​
​
//将字符数组chars赋值到串T
​
//如果操作成功,返回OK,否则返回ERROR
​
int StrAssign(HString *T,char *chars)
​
{
​
//★★★请补全代码
    int i = 0;
    for(;chars[i] !='\0';i++)
    {
    }
    if(!i)
    {
        T->ch = NULL;
        T->length = 0;
    }
    else
    {
        int j = 0;
        for(j = 0;chars[j] != '\0';j ++)
        {
            T->ch[j] = chars[j];
            T->length ++;
        }
        
    }
    return OK;
​
​
}
​
​
​
   
​
// 比较字符串大小
​
//(1)如果两个串长度相等,且每一个相应位置上的字符都一样,则结果为0;
​
//(2)如果两个串长度不相等,则则以第一个不相同的字符作为基准,返回第一个不相同的字符ASCII差值;
​
//(3)如果两个串长度不相等,且所有相应位置上的字符都一样,则返回两个字符串的长度之差。
​
int StrCompare(HString S,HString T)
​
{
​
  //★★★请补全代码
  int i = 0;
  while(i < S.length && i < T.length)
  {
        if(S.ch[i] != T.ch[i])  return (S.ch[i] - T.ch[i]);
        i++; 
  }
  return S.length - T.length;
​
​
​
}//StrCompare    
​
​
​
int main()
​
{
​
    HString S;
​
    HString T;
​
    char mainstr[20];
​
    char substr[10];
​
    int index;
​
    InitString(&S);
​
    InitString(&T);
​
    gets(mainstr);
​
    gets(substr);
​
    StrAssign(&S,mainstr);
​
    StrAssign(&T,substr);
​
    printf("%d\n",StrCompare(S,T));
​
    return 1;
​
}

6. 2023春 期中考试 第六题 综合题(一) (7分)
#define MAXINTSIZE 512 /* 最大整数长度 */
​
#include<stdio.h>
​
#include<stdlib.h>
​
​
​
#define ERROR 0
​
#define OK 1
​
typedef int Status;
​
​
​
typedef struct Node
​
{
​
    int data;
​
    struct Node *next;
​
} LNode;
​
typedef LNode *LinkList;
​
​
​
/* 用头插法建立单链表 */
​
Status CreateList(LinkList *L, char *chars)
​
{
​
     //★★★请补全代码
    LinkList p = (*L);
    int i = 0;
    for(;chars[i] != '\0';i ++)
    {
        LNode *r;
        r = (LinkList)malloc(sizeof(LNode));
        if(!r)  return ERROR;
        r->data = chars[i] - '0';
        r->next = p->next;
        p->next = r;
        //p = r;
    }
    return OK;
​
​
​
}
​
​
​
int ListLength_L(LinkList L){
​
    LinkList p;
​
    int i=0;             
​
    p=L->next;        //p指向第一个结点
​
    while(p){         //遍历单链表,统计结点数
​
        i++;
​
        p=p->next;
​
    } 
​
    return i;                             
​
}// ListLength_L
​
​
​
Status  InversePrint(LinkList p){
​
   //逆序打印不带头结点的单链表的元素    
​
   if(!p) return OK;
   
   //printf("%d",p->data);
​
   InversePrint(p->next);
​
   printf("%d",p->data);
​
   return OK;
​
}// 
​
​
​
int main()
​
{
​
    int len;
​
    char str[MAXINTSIZE+1];
​
    LinkList L;
​
    scanf("%s", str);
    
    L = (LinkList)malloc(sizeof(LNode));
​
    CreateList(&L, str);
​
    len=ListLength_L(L);
​
    printf("the length of the integer is %d\n", len);
​
    InversePrint(L->next);
​
    printf("\n");
​
    return 0;
​
}
​

7. 2023春 期中考试 第六题 综合题(二) (7+6=13分)
#include<stdio.h>
​
#include<stdlib.h>
​
​
​
#define ERROR 0
​
#define OK 1
​
​
​
typedef int Status;
​
​
​
typedef struct Node
​
{
​
    int data;
​
    struct Node *next;
​
} LNode;
​
typedef LNode *LinkList;
​
​
​
Status InitList(LinkList *L)
​
{
​
    *L = (LinkList)malloc(sizeof(LNode));
​
    if (*L == NULL)
​
        return ERROR;
​
    (*L)->next = NULL;
​
    return OK;
​
}
​
// 单链表表示的大整数与整数相乘
​
//自己的代码
//int int_mult(LinkList *L, int base) 
//{
//  
//  int carry = 0;
//  LNode *p = (*L);
//  LNode *pre = NULL;
//  
//  while(p)
//  {
//      p->data = p->data * base + carry;
//      carry = p->data / 10;
//      p->data = p->data % 10;
//      pre = p;
//      p = p->next;
//  }
//  
//  if(!p && carry)
//  {
//      p = (LinkList)malloc(sizeof(LNode));
//      if(!p)  return ERROR;
//      p->data = carry;
//      p->next = NULL;
//      pre->next = p;
//  }
//  return OK;
//}
​
// 单链表表示的大整数与整数相乘
​
int int_mult(LinkList *L, int base) {
    int carry = 0;
    LinkList p = *L; // 从链表头开始遍历
    LinkList pre = NULL; // 记录当前节点的前一个节点,为后面进行尾插新节点提供前驱
​
    // 遍历链表
    while (p || carry != 0) {
        if (!p) {
            // 如果 p 为空,创建一个数据为 0 的新节点
            LNode *r = (LinkList)malloc(sizeof(LNode));
            if (r == NULL)
                return ERROR; // 如果内存分配失败,则返回错误
            r->data = 0;
            r->next = NULL;
​
            // 将新节点插入到链表末尾
            if (pre) {
                pre->next = r;
            } else {
                *L = r; // 如果链表为空,则将新节点设为链表头
            }
            p = r; // 更新 p 为新插入的节点
        }
​
        // 将当前数字乘以基数,并加上进位
        p->data = p->data * base + carry;
        carry = p->data / 10; // 更新下一轮迭代的进位
        p->data %= 10; // 更新当前数字
​
        pre = p; // 更新前一个节点为当前节点
        p = p->next; // 移动到链表中的下一个节点
    }
    
    return OK; // 如果乘法运算成功,则返回 OK
}
​
​
​
//统计计算结果中0-9出现个数    
​
void CountNum(LinkList L, int *num)
​
{
​
//★★★请补全代码
    LinkList p = L->next;
    while(p)
    {
        num[p->data]  ++;
        p = p->next;
     } 
​
}
​
​
​
Status InversePrint(LinkList p){
​
   //逆序打印不带头结点的单链表的元素    
​
   if(!p) return OK;
​
   InversePrint(p->next);
​
   printf("%d",p->data);
​
   return OK;
​
}// 
​
​
​
int main()
​
{
​
    int a,n; /* a为底数(0<a<9),n为指数 */
​
    int len=0;
​
    int num[10]; /* 用于统计计算结果中0-9出现次数 */
​
    LinkList p;
​
    LinkList L;
​
    InitList(&L);
​
    scanf("%d%d",&a,&n);
​
    int i;
​
    for(i=0; i<10; i++)
​
        num[i]=0;        
​
    /* 生成表头节点并放入1 */
​
    p=(LinkList)malloc(sizeof(LNode));
​
    if(p==NULL) return ERROR;
​
    p->data=1;
​
    p->next=NULL;
​
    L->next=p;
​
    /* 反复调用乘a操作n次 */
​
    for(i=0; i<n; i++)
​
        int_mult(&L, a);
​
​
​
    /* 打印计算结果 */
​
    InversePrint(L->next);
​
    printf("\n");
​
    /* 统计计算结果中0-9出现个数 */
​
    CountNum(L, num);
​
    for(i=0; i<10; i++){
​
        printf("the number of %d is: %d\n", i, num[i]);
​
        len+=num[i];
​
    }
​
    printf("the length of the result is %d\n", len);
​
    return 0;
​
}
​
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值