連結串列-插入排序

HowieLee59發表於2019-03-14

Problem Description

現有 n 個從小到大排列的陣列成的序列。需要對這個序列進行 c 次操作。

每次操作有兩種型別:

  • 操作 1:插入一個數 v 到序列中,並保持有序。
  • 操作 2:輸出當前的序列。

bLue 並不太擅長序列操作,所以他想來請求你的幫助,你能幫助他完成這個任務嗎?

Input

輸入資料有多組(資料組數不超過 30),到 EOF 結束。

對於每組資料:

  • 第 1 行輸入一個整數 n (1 <= n <= 10^5),表示初始的有序序列中數字的個數。
  • 第 2 行輸入 n 個用空格隔開的整數 ai (0 <= ai <= 10^6),表示初始序列。
  • 第 3 行輸入一個整數 c (1 <= c <= 1000),表示有 c 次操作。
  • 接下來有 c 行,每行表示一次操作:
    • 如果操作型別為 1,則輸入格式為 "1 v",其中 v (0 <= v <= 1000) 表示要插入到序列的數。
    • 如果操作型別為 2,則輸入格式為 "2"。

Output

對於每組資料中的每次型別為 2 的操作,輸出一行,表示當前的序列,每個數之間用空格隔開。

Sample Input

5
1 2 2 3 5
5
1 0
2
1 3
1 7
2

Sample Output

0 1 2 2 3 5
0 1 2 2 3 3 5 7

Hint

Source

【第六屆ACM趣味程式設計迴圈賽 Round #2】bLue

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

typedef struct Node{
    int data;
    struct Node *next;
    //struct Node *prime;
}node;

void create(node * &head,int count){
    node *tail,*p;
    head = new Node;
    head->next = NULL;
    tail = head;
    for(int i = 0 ; i < count;i++){
        p = new Node;
        scanf("%d",&p->data);
        p->next = NULL;
        tail->next = p;
        tail = p;
    }
}

void print(node * &head){
    node *p;
    //p = new Node;
    p = head->next;
    while(p){
        if(p->next == NULL){
            printf("%d\n",p->data);
        }else{
            printf("%d ",p->data);
        }
        p = p->next;
    }
}

void add(node * &head,int n){
    node *p,*q;
    node *tail;
    tail = new Node;
    tail = head;
    int a,b;
    for(int i = 0 ; i < n ; i++){
        scanf("%d",&a);
        if(a == 1){
            scanf("%d",&b);
            p = new Node;
            //q = new Node;
            //printf("           %d        ",b);
                for(q = tail;((q->next != NULL)&&(q->next->data < b)); q = q->next);
            p->data = b;
            p->next = q->next;
            q->next = p;
            //print(head);
        }else{
            print(head);
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    node *head;
    node *p,*q;
    //head = new Node;
    //head->next = NULL;
    int count,n;
    while(~scanf("%d",&count)){
        create(head,count);
        scanf("%d",&n);
        add(head,n);
        p = head->next;
        while(p)
         {
             q=p->next;
             free(p);
             p=q;
         }
    }
    return 0;
}

注意使用結束之後要刪除節點,否則會爆記憶體 

相關文章