数据结构实验一 线性表

目录

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;
}

猜你喜欢

转载自blog.csdn.net/timberman666/article/details/133894218