数据结构与算法分析 c++11 练习3.2 通过只调整链(而不是数据)来交换两个相邻的元素
2017-05-10 13:35
447 查看
练习3.2 通过只调整链(而不是数据)来交换两个相邻的元素,分别使用
a. 单链表。
b. 双链表。
singlyList.h
#pragma once
#include <iostream>
struct ListNode {
int value;
ListNode * pNext;
};
void addListNode(ListNode * & p, int v) {
if (p==NULL) {
ListNode * pTem = new ListNode;
pTem->pNext = NULL;
pTem->value = v;
p = pTem;
}
else
addListNode(p->pNext, v);
}
void swap(ListNode * & p) { //chang the neighboring node;
if (NULL == p)
return;
ListNode * p1;
ListNode * p2;
p1 = p->pNext;
p2 = p1->pNext;
p1->pNext = p2->pNext;
p->pNext = p2;
p2->pNext = p1;
}
void traverse(ListNode * p) { //traverse the list and output the value
while (NULL != p)
{
std::cout << p->value << " ";
p = p->pNext;
}
std::cout << std::endl;
return;
}
doublyList.h
#pragma once
#include <iostream>
struct DbListNode {
int value;
DbListNode * pNext;
DbListNode * pPre;
};
DbListNode * pTail;
void addDoublyListNode(DbListNode * & p, int v) {
if (NULL == p) {
if (NULL == pTail) {
DbListNode * pTem = new DbListNode;
pTem->pNext = NULL;
pTem->pPre = NULL;
pTem->value = v;
p = pTem;
pTail = pTem;
}
else {
DbListNode * pTem = new DbListNode;
pTem->pNext = NULL;
pTem->pPre = pTail;
pTem->value = v;
p = pTem;
pTail = pTem;
}
}
else
addDoublyListNode(p->pNext, v);
}
void swapDoublyList(DbListNode * & p) { //chang the neighboring node;
if (NULL == p)
return;
DbListNode * p1;
DbListNode * p2;
p1 = p->pNext;
p2 = p1->pNext;
p1->pNext = p2->pNext;
p2->pNext->pPre = p1;
p->pNext = p2;
p2->pPre = p;
p2->pNext = p1;
p1->pPre = p2;
}
void printDbList(DbListNode * p) { //traverse the list and output the value
while (NULL != p)
{
std::cout << p->value << " ";
p = p->pNext;
}
std::cout << std::endl;
DbListNode * p1 = pTail;
while (NULL != p1)
{
std::cout << p1->value << " ";
p1 = p1->pPre;
}
std::cout << std::endl;
std::cout << std::endl;
return;
}
main.cpp
#include "singlyList.h"
#include "doublyList.h"
using namespace std;
ListNode * psHead = NULL;
DbListNode *pdHead = NULL;
int main()
{
// singly List
cout << "singly List switch test: " << endl;
addListNode(psHead, 1);
addListNode(psHead, 2);
addListNode(psHead, 3);
addListNode(psHead, 4);
addListNode(psHead, 5);
traverse(psHead);
swap(psHead->pNext);
traverse(psHead);
cout << endl << endl;
cout << "Doubly List switch test: " << endl;
pTail = NULL;
addDoublyListNode(pdHead, 1);
addDoublyListNode(pdHead, 2);
addDoublyListNode(pdHead, 3);
addDoublyListNode(pdHead, 4);
addDoublyListNode(pdHead, 5);
printDbList(pdHead);
//swapDoublyList(pdHead);
swapDoublyList(pdHead->pNext);
printDbList(pdHead);
return 0;
}
a. 单链表。
b. 双链表。
singlyList.h
#pragma once
#include <iostream>
struct ListNode {
int value;
ListNode * pNext;
};
void addListNode(ListNode * & p, int v) {
if (p==NULL) {
ListNode * pTem = new ListNode;
pTem->pNext = NULL;
pTem->value = v;
p = pTem;
}
else
addListNode(p->pNext, v);
}
void swap(ListNode * & p) { //chang the neighboring node;
if (NULL == p)
return;
ListNode * p1;
ListNode * p2;
p1 = p->pNext;
p2 = p1->pNext;
p1->pNext = p2->pNext;
p->pNext = p2;
p2->pNext = p1;
}
void traverse(ListNode * p) { //traverse the list and output the value
while (NULL != p)
{
std::cout << p->value << " ";
p = p->pNext;
}
std::cout << std::endl;
return;
}
doublyList.h
#pragma once
#include <iostream>
struct DbListNode {
int value;
DbListNode * pNext;
DbListNode * pPre;
};
DbListNode * pTail;
void addDoublyListNode(DbListNode * & p, int v) {
if (NULL == p) {
if (NULL == pTail) {
DbListNode * pTem = new DbListNode;
pTem->pNext = NULL;
pTem->pPre = NULL;
pTem->value = v;
p = pTem;
pTail = pTem;
}
else {
DbListNode * pTem = new DbListNode;
pTem->pNext = NULL;
pTem->pPre = pTail;
pTem->value = v;
p = pTem;
pTail = pTem;
}
}
else
addDoublyListNode(p->pNext, v);
}
void swapDoublyList(DbListNode * & p) { //chang the neighboring node;
if (NULL == p)
return;
DbListNode * p1;
DbListNode * p2;
p1 = p->pNext;
p2 = p1->pNext;
p1->pNext = p2->pNext;
p2->pNext->pPre = p1;
p->pNext = p2;
p2->pPre = p;
p2->pNext = p1;
p1->pPre = p2;
}
void printDbList(DbListNode * p) { //traverse the list and output the value
while (NULL != p)
{
std::cout << p->value << " ";
p = p->pNext;
}
std::cout << std::endl;
DbListNode * p1 = pTail;
while (NULL != p1)
{
std::cout << p1->value << " ";
p1 = p1->pPre;
}
std::cout << std::endl;
std::cout << std::endl;
return;
}
main.cpp
#include "singlyList.h"
#include "doublyList.h"
using namespace std;
ListNode * psHead = NULL;
DbListNode *pdHead = NULL;
int main()
{
// singly List
cout << "singly List switch test: " << endl;
addListNode(psHead, 1);
addListNode(psHead, 2);
addListNode(psHead, 3);
addListNode(psHead, 4);
addListNode(psHead, 5);
traverse(psHead);
swap(psHead->pNext);
traverse(psHead);
cout << endl << endl;
cout << "Doubly List switch test: " << endl;
pTail = NULL;
addDoublyListNode(pdHead, 1);
addDoublyListNode(pdHead, 2);
addDoublyListNode(pdHead, 3);
addDoublyListNode(pdHead, 4);
addDoublyListNode(pdHead, 5);
printDbList(pdHead);
//swapDoublyList(pdHead);
swapDoublyList(pdHead->pNext);
printDbList(pdHead);
return 0;
}
相关文章推荐
- 练习 3.3 通过只调整指针(不是数据)来交换两个相邻的元素
- p62 练习3.3 通过只调整指针(而不是数据)来交换两个相邻的元素,使用:
- 通过只调整指针(而不是数据)来交换两个相邻的元素
- 8.通过调整链来交换两个相邻的元素
- 7-6 冒泡法排序(20 分) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素
- 只调整指针来交换两个相邻的元素【双链表】
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 有两个序列a,b,大小都有n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b无素的和]之间的差最大。
- 习题3.3---只通过调整指针来达到相邻结点交换的过程
- 《数组-规划》 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 华为面试题:通过交换元素,使两个数组的元素和之差最小
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 华为面试题 题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 【学习点滴-数据结构-单链表】交换单链表中任意两个元素
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 用单循环链表存储一个环上的数据,并计算任意两个相邻元素之差是否超过2
- 写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
- 关于通过异或交换两个元素的值的一个陷阱