Untitled
unknown
c_cpp
2 years ago
3.1 kB
7
Indexable
#include<stdio.h> #include<stdlib.h> typedef struct _Node{ int size; int* data; struct _Node* next; } Node; Node* ReadOneList(){ int index, num; char tmp; Node* node = (Node*)malloc(sizeof(Node)); scanf("%d%c", &node->size, &tmp); node->data = (int*)malloc(sizeof(int)*(node->size)); for(int i = 0; i < node->size; i++){ scanf("%d", &node->data[i]); } return node; } void PrintList(Node* head){ head = head->next; while(head != NULL){ for(int i = 0; i < head->size; i++){ if(i == head->size-1) printf("%d\n", head->data[i]); else printf("%d ", head->data[i]); } head = head->next; } return; } void Merge(Node* node, int x, int y){ Node* target = node;//要被合併的node Node* tmp = node; Node* pre = node;//被合併的node的上一個node for(int i = 0; i < x; i++) { if(i == x-1) pre = target; target = target->next; } for(int i = 0; i < y; i++){ tmp = tmp->next; } pre->next = target->next; int* data_tmp = (int*)malloc(sizeof(int)*(tmp->size)); for(int i = 0; i < tmp->size; i++){ data_tmp[i] = tmp->data[i]; } free(tmp->data); tmp->data = (int*)malloc(sizeof(int)*(target->size + tmp->size)); for(int i = 0; i < tmp->size; i++){ tmp->data[i] = data_tmp[i]; } free(data_tmp); for(int i = 0; i < target->size; i++){ tmp->data[(tmp->size)+i] = target->data[i]; } tmp->size += target->size; free(target->data); free(target); return; } void Cut(Node* node, int x, int a){ Node* cutted = node; //要被切的node Node* new = (Node*)malloc(sizeof(Node)*1); //被切出來的node for(int i = 0; i < x; i++){ cutted = cutted->next; } int* data_tmp = (int*)malloc(sizeof(int)*(cutted->size)); for(int i = 0; i < cutted->size; i++){ data_tmp[i] = cutted->data[i]; } free(cutted->data); cutted->data = (int*)malloc(sizeof(int)*(a)); new->data = (int*)malloc(sizeof(int)*(cutted->size-a)); for(int i = 0; i < a; i++){ cutted->data[i] = data_tmp[i]; } for(int i = a; i < cutted->size; i++){ new->data[i-a] = data_tmp[i]; } new->next = cutted->next; cutted->next = new; new->size = cutted->size - a; cutted->size = a; return; } int main(){ Node* dummy_head; Node* tail; dummy_head = (Node*) malloc( sizeof(Node) ); dummy_head->data = NULL; dummy_head->size = -1; tail = dummy_head; int N, M; scanf("%d %d", &N, &M); for(int i=0; i<N; i++){ tail->next = ReadOneList(); tail = tail->next; } char act[10]; int x, y; for(int i=0; i<M; i++){ scanf("%s %d %d", act, &x, &y); if( act[0] == 'M' ){ Merge(dummy_head, x, y); } else{ Cut(dummy_head, x, y); } } PrintList(dummy_head); return 0; }
Editor is loading...