已解决
数据结构实验一 线性表
来自网友在路上 178878提问 提问时间:2023-10-19 16:31:54阅读次数: 78
最佳答案 问答题库788位专家为你答疑解惑
目录
1. 好玩的约瑟夫环-单链表版本
2. 递增有序顺序表的插入
1. 好玩的约瑟夫环-单链表版本
【题目描述】
有M个人,编号分别为1到M,玩约瑟夫环游戏,最初时按编号顺序排成队列;每遍游戏开始时,有一个正整数报数密码N,队列中人依次围坐成一圈,从队首的人开始报数,报到N的人出列,然后再从出列的下一人开始重新报数,报到N的人出列;重复这一过程,直至所有人出列,完成一遍游戏,所有出列的人形成新队列;游戏可能玩很多遍,每遍有新报数密码。求若干遍游戏完成后队列次序。本题要求使用单链表实现,程序要求采用模块化设计,格式规范,有合适注解。
【输入描述】
每个测试用例包含若干个正整数(至少1个),第一个正整数为玩游戏人数M,后续每个正整数为每遍游戏报数密码;报数密码可能为1
【输出描述】
每个测试用例结果占一行,每个编号占4位。
【样例输入】
10 3 5 2
【样例输出】
4 6 5 2 9 1 3 7 8 10
#include<stdio.h>
#include<stdlib.h>typedef struct Node{int data;struct Node *next;
}Node,*LinkList;LinkList CreatNew(){LinkList temp;temp=(LinkList)malloc(sizeof(Node));temp->next=NULL;return temp;
}void BuildCircle(LinkList *p,int m){if(m == 0){return;}LinkList phead,pnew,pold;phead=*p;pold=phead;int i;for(i=1;i<=m;i++){pnew=CreatNew();pnew->data=i;pold->next=pnew;pold=pold->next;}pold->next=phead->next;
}
void append(LinkList *p1,LinkList *p2, int n){LinkList phead1,phead2,pold,pafter,pnext;phead1=*p1;phead2=*p2;pold=phead1->next;pafter=pold->next;pnext=phead2;while (phead1->next){if(n>=3){int i;for(i=0;i<n-2;i++){pold=pold->next;pafter=pold->next;}}else if(n==2){pafter=pold->next;}else if(n==1){pold=phead1;pafter=pold->next;}if(!phead2->next){phead2->next=pafter;pnext=pnext->next;}else{pnext->next=pafter;pnext=pnext->next;}pold->next=pafter->next;pold=pold->next;if(pold==pold->next){pnext=pold;pnext->next=NULL;break;}if(n==1){if(pafter->next && pafter->next->data==phead2->next->data){pafter->next=NULL;break;}}}}void print(LinkList p, int m){int i;for(i=0;i<m;i++){printf("%4d",p->next->data);p=p->next;}
}void repeat(LinkList *p) {LinkList phead, pnext;phead = *p;pnext = phead -> next;while(pnext -> next) {pnext = pnext -> next;}pnext -> next = phead -> next;}
void destroy(LinkList p)
{LinkList pnext;while(p) {pnext = p -> next;free(p);p = pnext;}
}int main(){LinkList p1,p2;p1=CreatNew();p2=CreatNew();int m;scanf("%d",&m);BuildCircle(&p1, m);int x;scanf("%d",&x);if(x==NULL){print(p1,m);return 0;}append(&p1,&p2,x);while(getchar() == ' ') {p1 = p2;repeat(&p1);p2 = CreatNew();scanf("%d",&x);append(&p1,&p2,x);}print(p2,m);destroy(p2);return 0;
}
2. 递增有序顺序表的插入
实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现
【问题描述】
已知顺序表L递增有序,将X插入到线性表的适当位置上,保证线性表有序。
【输入形式】
第1行输入顺序表长度,第2行输入递增有序的顺序表,第3行输入要插入的数据元素X。
【输出形式】
对每一组输入,在一行中输出插入X后的递增的顺序表。
【样例输入】
在这里给出一组输入。例如:
5 1 3 5 7 9 6
【样例输出】
在这里给出相应的输出。例如:
1,3,5,6,7,9,
【样例说明】
【评分标准】
#include <stdio.h>
#include <stdlib.h>typedef struct Node {int num;struct Node* next;
} Node, * LinkList;int main() {LinkList head = NULL;LinkList tail = NULL;int k;scanf("%d", &k);int n;char ch;while (scanf("%d%c", &n, &ch)) {LinkList newNode = (LinkList)malloc(sizeof(Node));if (newNode == NULL) {printf("Error: Failed to allocate memory for new node\n");return 1;}newNode->num = n;newNode->next = NULL;if (head == NULL) {head = newNode;tail = newNode;} else {tail->next = newNode;tail = tail->next;}if (ch == '\n') {break;}}int NewNum, cnt = 0, i;scanf("%d", &NewNum);LinkList p = head;for (i = 0; i < k; i++) {if (p == NULL) {break;}if (p->num < NewNum) {printf("%d", p->num);printf(",");p = p->next;cnt++;} else {printf("%d", NewNum);printf(",");break;}}if(cnt==k){printf("%d", NewNum);printf(",");}for (i = cnt; i < k; i++) {if (p == NULL) {break;}printf("%d", p->num);printf(",");p = p->next;}return 0;
}
查看全文
99%的人还看了
相似问题
- 深度学习之基于YoloV5-Pose的人体姿态检测可视化系统
- 【毕业论文】基于MATLAB的人脸识别算法的研究
- 怎么通过联表合并表格的后查找不同职务职称的人数(python自动化办公,表格合并,同时查询不同类别情况下的个数)
- 基于yolov2网络的人脸识别系统matlab仿真,包括识别正脸,侧脸等
- AI:62-基于深度学习的人体CT影像肺癌的识别与分类
- 怎样提取视频提取的人声或伴奏?
- 基于深度学习的人脸表情识别 计算机竞赛
- 中国人民大学与加拿大女王大学金融硕士——在职读研,演绎精彩的人生
- 基于Java的人事考勤签到管理系统设计与实现(源码+lw+部署文档+讲解等)
- 使用python-opencv检测图片中的人像
猜你感兴趣
版权申明
本文"数据结构实验一 线性表":http://eshow365.cn/6-19743-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!