Reversing Linked List

来源:互联网 发布:修真淘宝大户更新 编辑:程序博客网 时间:2024/06/04 00:26
//开始时,最大输入时,运行超时//牺牲空间换时间,时间复杂度由O(n^2)变为O(n);#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct data{int addr;int key;int next;} Data, *pData;typedef struct st{int addr;int total;int count;} Start,*pStart;void PrintResult(Data arr[],int count){int i;for (i = 0; i < count - 1; i++){printf("%05d %d %05d\n",arr[i].addr,arr[i].key,arr[i].next);}printf("%05d %d %d",arr[i].addr,arr[i].key,arr[i].next);return ;}void ScanfStart(pStart a){scanf("%d%d%d",&a->addr,&a->total,&a->count);return ;}void ReverData(pData arr, int n){int i;Data temp;for (i = 0; i < n / 2; i++){temp.addr = arr[i].addr;temp.key = arr[i].key;temp.next = arr[i].next;arr[i].addr = arr[n-i-1].addr;arr[i].key = arr[n-i-1].key;arr[i].next = arr[n-i-1].next;arr[n-i-1].addr = temp.addr;arr[n-i-1].key = temp.key;arr[n-i-1].next = temp.next;}}void CorrectAddress(pData arr, int n){int i;pData temp = (pData)malloc(n*sizeof(Data));memcpy(temp, arr, n * sizeof(Data));for (i = 0; i < n - 1; i++){arr[i].next = temp[i+1].addr;}arr[n-1].next = -1;free(temp);}//开始时用的双重循环,运行超时了。void SortData(pStart start, pData arr, pData num){int i,j;int dest;int count = 0;dest = start->addr;while (dest != -1){arr[count].addr = num[dest].addr;arr[count].key = num[dest].key;arr[count].next = num[dest].next;dest = arr[count].next;count++;}start->total = count;}int main(){Start s;int count,addr,key,next;int revercount;pData temp;ScanfStart(&s);pData num = (pData)malloc(100001 * sizeof(Data));count = s.total;while (count){scanf("%d%d%d",&addr,&key,&next);num[addr].addr = addr;num[addr].key = key;num[addr].next = next;count--;}pData arr = (pData)malloc(s.total * sizeof(Data));SortData(&s,arr,num);free(num);revercount = s.total / s.count;if (s.count > 1){for (count = 0; count < revercount; count++){temp = arr + s.count * count;ReverData(temp,s.count);}CorrectAddress(arr,s.total);}PrintResult(arr,s.total);free(arr);return 0;}

0 0
原创粉丝点击