当前位置:首页 > 编程笔记 > 正文
已解决

数据结构实验一 线性表

来自网友在路上 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%的人还看了

猜你感兴趣

版权申明

本文"数据结构实验一 线性表":http://eshow365.cn/6-19743-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!