标签:turn 学习 检查 一个 rand size std 位置 双向
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include"3197103119_list_reversal.h"
int main()
{
DList L;
int leng,time;
int EX,ex;
int ex1,ex2,ex3;
Link fr1,fr2;
Link RF,RC;
initial(&L);
// srand(time(NULL));
do{
printf("输入循环双向链结表 L 的元素个数 (1 与 100 (含)之间):");
scanf("%d", &leng);
}while(leng < 0 || leng > 100);
//赋值
Link current;
for(ex1 = 0;ex1 < leng;ex1++)
{
do{
ex = 1;
EX = rand()%100;
current = L.head;
for(ex2 = 0;ex2 < ex1;ex2++)
{
if(EX == current->elem)
{
ex = 0;
break;
}
current = current->next;
}
}while(ex == 0);
insert(&L,EX);
}
printf("\n循环双向链结表 L:\n");
printlst(L);
printf("\n");
// RF = (L.head)->prev;
// (L.head)->prev = (L.tail)->next;
// (L.tail)->next = RF;
//
// RF = (L.head)->next;
// (L.head)->next = (L.tail)->prev;
// (L.tail)->prev = RF;
//
// current = L.head;
// L.head = L.tail;
// L.tail = current;
fr1 = L.head;
for(ex1 = 0;ex1 < leng;ex1++)
{
ex = fr1->elem;
rain(&L,ex);
fr1 = L.head;
for(ex2 = 0;ex2 <= ex1;ex2++)
fr1 = fr1->prev;
}
printlst(L);
// ex = 0;
//
// Link fex;
// fr1 = L.head;
// fr2 = L.tail;
// do{
// fex = fr1->elem;
// fr1->elem = fr2->elem;
// fr2->elem = fex;
//
// fr1 = fr1->prev;
// fr2 = fr2->next;
// ex++;
// }while(ex != leng/2 + 1);
//
// printlst(L);
// ex = 0;
//
// Link RF,RC;
//
// fr1 = L.head;
// fr2 = L.head;
// fr2 = fr2->prev;// 1 -> 4
//
// RF = fr1->prev;// RF = 1.h
// fr1->prev = fr2->next;// 1.h -> 4.t
// fr2->next = RF;// 4.t -> RF
//
// RF = fr1->next;// RF = 1.t
// fr1 = fr1->next;// 1 -> 2
// RC= fr1->prev;// RC = 2.h
// fr1->prev = RF;// 2.h -> RF
// fr1 = fr1->prev;// 2 -> 1
// fr1->next = RC;// 1.h -> RC
//
// RF = fr2->prev;// RF = 4.h
// fr2 = fr2->prev;// 4 -> 3
// RC = fr1->next;// RC = 3.t
// fr2->next = RF;// 2.t -> RF
// fr2 = fr2->next;// 3 -> 4
// fr2->prev = RC;// 4.h -> RC
//
// //try
// fr1 = fr1->next;// 1 -> 2
// fr2 = fr2->prev;// 4 -> 3
// RF = fr1->next;
// fr1->next = fr2->prev;
// fr2->prev = RF;
//
// printlst(L);
//
// Link RF,RC;
// fr1 = L.head;
// fr2 = L.tail;
// fr2 = fr2->prev;
//
// fr1 = fr1->prev;
// fr2 = fr2->next;
//
// RF = fr1->next;
// RC = fr2->prev;
//
// fr1 = fr1->next;
// fr2 = fr2->prev;
//
// fr1->prev = RF;
// fr2->next = RC;
//
//
// fr1->prev = RF;
// fr2->next = RC;
//
//
// fr1 = fr1->next;
// fr2 = fr2->prev;
//
// RF = fr1->prev;
// RC = fr2->next;
//
// fr1 = fr1->prev;
// fr2 = fr2->next;
//
// fr1->next = RF;
// fr2->prev = RC;
//
// printlst(L);
// fr1 = L.head;
// fr2 = L.head;
// fr2 = fr2->prev;
// for(ex = 0;ex < leng/2;ex++)
// {
// swap(fr1,fr2);
// fr1 = fr1->next;
// fr2 = fr2->prev;
// }
// if(leng%2 == 1)
// {
//
// }
//
// current = L.head;
// L.head = L.tail;
// L.tail = current;
//
// printlst(L);
return 0;
}
int rain(DList *L, ElemType e) {
Link currentX;
Link previousX;
Link current = L->head; // 指向头节点。
Link previous = L->tail; // 指向尾节点。
Link newNode;// 新节点的指针。
int size = getSize(*L); // 循环双向链结表的元素个数。
int position = 0,ex;
do { // 当循环双向链结表还有节点。
if (current->elem==e) { // 找到要删除的节点。
if (position==0) { // 删除的节点是头节点。
if (current->next==current) { // 循环双向链结表只有一个节点。
L->head = NULL; // 将头节点清空。
L->tail = NULL; // 将尾节点清空。
}
else {
previous->next = current->next; // 修改前一个节点的 next 指针。
current->next->prev = previous; // 修改下一个节点的 prev 指针。
L->head = current->next; // 更新头节点。
}
free(current); // 释放删除的节点。
}
else {
if (current->next==L->head) // 删除的是尾节点。
L->tail = previous; // 更新尾节点。
previous->next = current->next; // 修改前一个节点的 next 指针。
current->next->prev = previous; // 修改下一个节点的 prev 指针。
free(current); // 释放删除的节点。
}
}
else if (current->elem<e) { // 检查下一个节点。
previous = current; // 将目前的节点设为前一个节点。
current = current->next; // 将下一个节点设为下一步骤的目前节点。
position++; // 位置加 1。
}
} while (current!=L->head); // 若还没回到头节点,继续检查。
currentX = L->head;
for (ex = 0;ex < position;ex++)
{ // 寻找插入位置。
currentX = currentX->next; // 下一个 currentX。
}
previousX = currentX;
previousX = previousX->next;
//Cases 2, 3 & 4: 插入一个节点的 current 之前。
newNode = (Link) malloc(sizeof(Node)); // 要求一个新节点的内存。
newNode->elem = e; // 复制目前节点的数据。
newNode->prev = currentX; // 设定新节点的的 prev 指针。
previousX->next = newNode; // 将前一节点的 next 指针指向新节点。
newNode->next = previousX; // 设定新节点的 next 指针。
currentX->prev = newNode; // 将现节点的 prev 指针指向新节点。
if (ex == 0) L->head = newNode; // Case 2:更新头节点。
else if (ex == size) L->tail = newNode; // Case 4: 更新尾节点。
}
标签:turn 学习 检查 一个 rand size std 位置 双向
原文地址:https://www.cnblogs.com/Dawan/p/12894120.html