|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <malloc.h>
FILE *fin, *fout; // 创建文件指针
/*
循环1
1. 输入两个数字(插入几个以及本来链表的长度)
2. 输入 N 个指令(value, index)
循环2
1. 输入Len 个元素
把原来的指令插入循环2
(1)找到index插入
第一个条件也许已经需要一个N空间了
当同种数字数量大于等于3 并且连在一起的话
(1)以当前的p 为末尾指针,先前的2 位给去掉
2中计划 num 1~2
1 2 3 3 3 2 2
num 只记住连续的,即上一个是否是这个(p指向的)一样
这次的目标是3,因为 3=3 (2) =3(3)
打印链表
*/
struct node
{
int num;
struct node *next, *pre;
};// 创建结构体
struct node *head, *p, *q; // head用来标记,q用来新建空间,p用来连接
int N, Len; // 分别是插入的命令的个数和本来链表的长度
void print()
{
p = head;
while(p != NULL)
{
printf("%d ", p -> num);
p = p -> next;
}
printf("\n");
}
int main()
{
fin = fopen("ok.in", "r");
fout = fopen("ok.out", "w");
fscanf(fin, "%d %d", &N, &Len); // 输入1 开始
const int n = N; int map[n][2]; // 创建临时变量
int i, j;
for(i = 1;i <= N;i++)
{
fscanf(fin, "%d %d\n", &map[i][0], &map[i][1]);
}
// 循环 2开始
int x; //作为中间变量
head = malloc(sizeof(struct node)); //创建头
fscanf(fin, "%d", &x); head -> num = x; // 首次尝试
head -> pre = NULL; // head的特性
p = head; // 临时变量
for(i = 2;i <= Len;i++)
{
q = malloc(sizeof(struct node));
p -> next = q;
q -> pre = p; // 建立连接
fscanf(fin, "%d", &x); q -> num = x; // 输入x
p = q; //替换(前进一步)
}
p -> next = NULL; // 结尾的特征
// 把原来的指令插入链表
for(i = 1;i <= N;i++)
{
p = head; // 回位
for(j = 1;j <= map[i][1]-1;j++) // 查找到那个位置
{
if(p -> next != NULL)p = p -> next; //前进
else break;
}
q = malloc(sizeof(struct node));
if(p -> next != NULL) {q -> next = p -> next;}
else
{
q -> next = NULL; // 默认排到最后
}
p -> next = q;
q -> pre = p;
q -> num = map[0]; // 插入
}
// 最重要的一部分(分开中)
p = head;
int best_num = 1;
int pre_num = p -> num;
for(i = 1;;i++)
{
if(p -> next == NULL) break;
p = p->next;
if(pre_num == p->num)
{
best_num += 1;
}else{best_num = 1;}
if(best_num >= 3)
{
// 这时就是这样的 1 2 3 3 3 2(p) 2
p -> pre -> pre -> pre -> next = p;
}
pre_num = p -> num;
}
if(pre_num == p->num)
{
best_num += 1;
}else{best_num = 1;}
if(best_num >= 3)
{
// 这时就是这样的 1 2 3 3 3 2(p) 2
p -> pre -> pre -> pre -> next = p;
}
print();
fclose(fin);
fclose(fout);
return 0;
}
[/i][/i][/i] |
|