02-线性结构3 Reversing Linked List

    技术2022-08-01  71

    #include<stdio.h> #include<stdlib.h> typedef struct { int address; int data; int next; } Node; typedef Node *PtrNode; void ArrayList(Node L[], int N, int first); void ReverseList(Node L[], int N, int K); void exchange(PtrNode a, PtrNode b); int main() { int first,N,K,E; scanf("%d %d %d", &first,&N,&K); Node List[N]; //读入 for(int i=0; i<N; i++) { scanf("%d %d %d",&List[i].address, &List[i].data,&List[i].next); } //排序 ArrayList(List, N, first); //数组名作为参数传递进函数 E=1; //非链表结点不输出 for(int i=0; i<N; i++) { if(List[i].next==-1) { break; } else { E++; } } //翻转 ReverseList(List, E, K); //打印 for(int i=0; i<E-1; i++) { printf("d %d d\n", List[i].address, List[i].data, List[i].next); } printf("d %d -1\n", List[E-1].address, List[E-1].data); return 0; } void ArrayList(Node L[], int N, int first) { for(int i=0; i<N; i++) { //确定数组第一个元素 if(L[i].address==first) { exchange(&L[0],&L[i]); //传入指针,别忘 & break; } } for(int i=0; i<N; i++) { //根据next确定确定数组顺序 for(int j=i+1; j<N; j++) { if(L[i].next==L[j].address) { exchange(&L[i+1],&L[j]); break; } else if(L[i].next==-1) { return; } } } } void ReverseList(Node L[], int N, int K) { //注意,是每K个翻转一次 for(int t=0; t<N/K; t++) { for(int i=0; i<K/2; i++) { //前K个元素置逆 exchange(&L[t*K+i],&L[t*K+K-1-i]); } } for(int i=0; i<N/K*K; i++) { //修改next L[i].next=L[i+1].address; } } void exchange(PtrNode a, PtrNode b) { //注意交换函数传入指针 Node c; //交换的内容是Node, 而非指针,指针目的是指向被操作位置 c=*a; *a=*b; *b=c; }

    Processed: 0.014, SQL: 9