02-线性结构2 Reversing Linked List
来源:互联网 发布:win7电脑连接网络 编辑:程序博客网 时间:2024/05/22 11:41
反转链表的练习:下面是自己试的代码
#include <stdio.h>#include <stdlib.h>typedef struct Node{ int Address; int data; int nextAddress; struct Node *next;}Node;typedef struct Node *LinkList;int main(){ LinkList L1 , p1 , q1; int i; int firstAddress , N , K; L1 = (LinkList)malloc(sizeof(Node)); L1->next = NULL; scanf("%d %d %d",&firstAddress,&N,&K); p1 = L1; for(i=0;i<N;i++){ q1 = (LinkList)malloc(sizeof(Node)); scanf("%d %d %d",&q1->Address,&q1->data,&q1->nextAddress); p1->next = q1; p1 = q1; } p1->next = NULL; printf("测试: \n"); p1 = L1->next; while(p1){ printf("%d %d %d\n",p1->Address,p1->data,p1->nextAddress); p1 = p1->next; } //sort the linklist LinkList L2 , p2 , q2; L2 = (LinkList)malloc(sizeof(Node)); L2->next = NULL; p2 = L2; int findAddress; findAddress= firstAddress; while(findAddress != -1){ q2 = (LinkList)malloc(sizeof(Node)); p1 = L1; while(p1 && findAddress != p1->Address){ p1 = p1->next; } q2->Address = p1->Address; q2->data = p1->data; q2->nextAddress = p1->nextAddress; findAddress = p1->nextAddress; p2->next = q2; p2 = q2; } p2->next = NULL; printf("测试2: \n"); p2 = L2->next; while(p2){ printf("%d %d %d\n",p2->Address,p2->data,p2->nextAddress); p2 = p2->next; } //start to reserve list int cnt = 1; LinkList New , Old , temp; New = L2->next; Old = New->next; while(cnt < K){ temp = Old->next; Old->next = New; New = Old; Old = temp; cnt++; } L2->next->next = Old; printf("反转的链表:\n"); while(New){ printf("%d %d %d\n",New->Address,New->data,New->nextAddress); New = New->next; }}反转链表的原理用陈越老师的图,说明一下:
不过我没想明白,如果K反转的个数是链表的单元个数呢,比如说6。。。
最后没通过。。。。。。。。
然后
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int address;
int data;
int nextAddress;
struct Node *next;
}Node;
typedef struct Node *LinkList;
int main()
{
//排序前
LinkList L1, p1, q1;
L1 = (LinkList)malloc(sizeof(Node)); //创建头指针
L1->next = NULL;
int firstAddress;
int N, K;//N为总结点数 K为需翻转的数
scanf("%d %d %d", &firstAddress, &N, &K);
p1 = L1;
for(int i = 0; i < N; i++) {
q1 = (LinkList)malloc(sizeof(Node));
scanf("%d %d %d",&q1->address, &q1->data, &q1->nextAddress);
p1->next = q1;
p1 = q1;
}
p1->next = NULL;
// //测试没问题
// printf("测试1 :\n");
// p1 = L1->next;
// while(p1){
// printf("%05d %d %d\n", p1->address, p1->data, p1->nextAddress);
// p1 = p1->next;
// }
//排序后
LinkList L2, p2;
L2 = (LinkList)malloc(sizeof(Node)); //创建头指针
L2->next = NULL;
int count = 0;
int findAddress = firstAddress;
p2 = L2;
while(findAddress != -1) { //while(count < N) {有多余结点不在链表上没通过
q1 = L1;
while(q1->next) {
if(q1->next->address == findAddress) {
p2->next = q1->next;
q1->next = q1->next->next;
p2 = p2->next;
count++;
// printf("count = %d\n",count);
findAddress = p2->nextAddress;
// printf("findAddress = %d\n",findAddress);
}else {
q1 = q1->next;
}
}
}
p2->next = NULL;
// //测试没问题
// printf("测试2 :\n");
// p2 = L2->next;
// while(p2){
// printf("%05d %d %05d\n", p2->address, p2->data, p2->nextAddress);
// p2 = p2->next;
// }
//Reversing
LinkList L3, p3, q3, tail;
L3 = (LinkList)malloc(sizeof(Node)); //创建头指针
L3->next = NULL;
//将L2以头插法插入L3
int n = count; //防止有多余结点影响 n=N 会影响
int k = K;
p3 = L3;
p2 = L2;
while(n >= k) {
n -= k;
for(int i = 0; i < k; i++) {
p3->next = p2->next;
p2->next = p2->next->next;
if(i == 0)
tail = p3->next;
else
p3->next->next = q3;
q3 = p3->next;
}
p3 = tail;
}
p3->next = L2->next;
p3 = L3->next;
while(p3->next) {
printf("%05d %d %05d\n",p3->address, p3->data, p3->next->address);//不到五位数用0补全
p3 = p3->next;
}
printf("%05d %d -1\n",p3->address, p3->data);
return 0;
}
- 02-线性结构2 Reversing Linked List
- 02-线性结构2 Reversing Linked List
- 02-线性结构2 Reversing Linked List
- 02-线性结构2 Reversing Linked List
- 02-线性结构2 Reversing Linked List
- 02-线性结构2 Reversing Linked List
- 02-线性结构3 Reversing Linked List
- 02-线性结构3 Reversing Linked List
- 02-线性结构3 Reversing Linked List
- 02-线性结构2 Reversing Linked List (25分)
- 线性结构---Reversing Linked List
- 02-线性结构1. Reversing Linked List (25)
- 02-线性结构2. Reversing Linked List (25)
- 02-线性结构1. Reversing Linked List (25)
- 02-线性结构2. Reversing Linked List (25)
- 02-线性结构2. Reversing Linked List (25)
- 02-线性结构2. Reversing Linked List (25)
- 02-线性结构1. Reversing Linked List (25)
- codeforces#225-C - Propagating tree-dfs序(奇偶)+线段树
- 反射浅析
- Spring框架的两个简化XML配置文件的p-namespace和c-namespace
- jQuery 事件注册与实时事件
- javascript 闭包
- 02-线性结构2 Reversing Linked List
- C#求三角形的周长和面积
- Codeforces 545 C Woodcutters(贪心/DP)
- 网上出名IT技术网站整理
- 程序人生-001-写程序我骄傲
- Linux常用基础指令记录
- #1034 : 毁灭者问题
- 如何学习C语言
- 进阶配置你的vim为c++IDE