练习 3.3 通过只调整指针(不是数据)来交换两个相邻的元素
2016-12-01 02:51
369 查看
单链表
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct Node{
int num;
struct Node *next;
};
typedef struct Node * PNODE;
PNODE Create()/*创建链表*/
{
PNODE phead = (PNODE)malloc(sizeof(struct Node));
phead->next = NULL;
PNODE PTlie = phead;
int lenth,number;
scanf("%d",&lenth);
printf("输入数字:");
for(int i = 0; i < lenth; i++)
{
PNODE pnew = (PNODE)malloc(sizeof(struct Node));
scanf("%d",&number);
pnew->num = number;
pnew->next =NULL;
PTlie->next = pnew;
PTlie = pnew;
}
return phead;
}
/*交换*/
void swap(PNODE p,int n)/*交换是当前位置和后面一个位置交换*/
{
int i = 0;
while(i != n - 1 && p->next != NULL)/*记录要交换结点的前一个结点*/
{
p = p->next;
i++;
}
if(p->next == NULL)
{
printf("no\n");
return ;
}
PNODE p1,p2;/*定义p1,p2分别记录要交换两个结点*/
p1 = p->next;
p2 = p1->next;
p1->next = p2->next;
p->next = p2;
p2->next = p1;
}
void print(PNODE p)
{
p = p->next;
for(int i = 0;p != NULL; i++)
{
printf("%d ",p->num);
p = p->next;
}
printf("\n\n");
}
int main(void)
{
PNODE p = Create();
int n;
printf("输入要交换的位置:");
scanf("%d",&n);/*交换是当前位置和后面一个位置交换*/
print(p);
swap(p,n);
print(p);
return 0;
}
双链表
#include<stdio.h>
#include<stdlib.h>
struct Node{
int num;
struct Node * next;
struct Node * last;
};
typedef struct Node * PNODE;
int lenth;
PNODE Create()/*创建一个双向循环链表*/
{
PNODE phead = (PNODE)malloc(sizeof(struct Node));
phead->next = phead;
phead->last = phead;
PNODE PTlie = phead;
int number;
scanf("%d",&lenth);
for(int i = 0; i < lenth; i++)
{
PNODE pnew = (PNODE)malloc(sizeof(struct Node));
scanf("%d",&number);
pnew->num = number;
pnew->next = phead;
pnew->last = PTlie;
PTlie->next = pnew;
PTlie = pnew;
}
return phead;
}
void swap(PNODE p,int n)/*交换是当前位置和后面一个位置交换*/
{
int i = 0;
while(i != n - 1 && p->next != NULL)/*记录要交换结点的前一个结点*/
{
p = p->next;
i++;
}
PNODE p1,p2;/*定义p1,p2分别记录要交换两个结点*/
p1 = p->next;
p2 = p1->next;
p1->next = p2->next;
p2->next->last = p1;/*这里注意,如果是双向不循环链表的话,最后两个数交换,会导致程序错误。因为p2->next为空*/
p->next = p2;
p2->last = p;
p2->next = p1;
p1->last = p2;
}
void print(PNODE p,int lenth)
{
p = p->next;
for(int i = 0; i < lenth; i++)
{
printf("%d ",p->num);
p = p->next;
}
printf("\n\n");
}
int main(void)
{
PNODE p = Create();
int n;
scanf("%d",&n);
print(p,lenth);
swap(p,n);
print(p,lenth);
return 0;
}
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct Node{
int num;
struct Node *next;
};
typedef struct Node * PNODE;
PNODE Create()/*创建链表*/
{
PNODE phead = (PNODE)malloc(sizeof(struct Node));
phead->next = NULL;
PNODE PTlie = phead;
int lenth,number;
scanf("%d",&lenth);
printf("输入数字:");
for(int i = 0; i < lenth; i++)
{
PNODE pnew = (PNODE)malloc(sizeof(struct Node));
scanf("%d",&number);
pnew->num = number;
pnew->next =NULL;
PTlie->next = pnew;
PTlie = pnew;
}
return phead;
}
/*交换*/
void swap(PNODE p,int n)/*交换是当前位置和后面一个位置交换*/
{
int i = 0;
while(i != n - 1 && p->next != NULL)/*记录要交换结点的前一个结点*/
{
p = p->next;
i++;
}
if(p->next == NULL)
{
printf("no\n");
return ;
}
PNODE p1,p2;/*定义p1,p2分别记录要交换两个结点*/
p1 = p->next;
p2 = p1->next;
p1->next = p2->next;
p->next = p2;
p2->next = p1;
}
void print(PNODE p)
{
p = p->next;
for(int i = 0;p != NULL; i++)
{
printf("%d ",p->num);
p = p->next;
}
printf("\n\n");
}
int main(void)
{
PNODE p = Create();
int n;
printf("输入要交换的位置:");
scanf("%d",&n);/*交换是当前位置和后面一个位置交换*/
print(p);
swap(p,n);
print(p);
return 0;
}
双链表
#include<stdio.h>
#include<stdlib.h>
struct Node{
int num;
struct Node * next;
struct Node * last;
};
typedef struct Node * PNODE;
int lenth;
PNODE Create()/*创建一个双向循环链表*/
{
PNODE phead = (PNODE)malloc(sizeof(struct Node));
phead->next = phead;
phead->last = phead;
PNODE PTlie = phead;
int number;
scanf("%d",&lenth);
for(int i = 0; i < lenth; i++)
{
PNODE pnew = (PNODE)malloc(sizeof(struct Node));
scanf("%d",&number);
pnew->num = number;
pnew->next = phead;
pnew->last = PTlie;
PTlie->next = pnew;
PTlie = pnew;
}
return phead;
}
void swap(PNODE p,int n)/*交换是当前位置和后面一个位置交换*/
{
int i = 0;
while(i != n - 1 && p->next != NULL)/*记录要交换结点的前一个结点*/
{
p = p->next;
i++;
}
PNODE p1,p2;/*定义p1,p2分别记录要交换两个结点*/
p1 = p->next;
p2 = p1->next;
p1->next = p2->next;
p2->next->last = p1;/*这里注意,如果是双向不循环链表的话,最后两个数交换,会导致程序错误。因为p2->next为空*/
p->next = p2;
p2->last = p;
p2->next = p1;
p1->last = p2;
}
void print(PNODE p,int lenth)
{
p = p->next;
for(int i = 0; i < lenth; i++)
{
printf("%d ",p->num);
p = p->next;
}
printf("\n\n");
}
int main(void)
{
PNODE p = Create();
int n;
scanf("%d",&n);
print(p,lenth);
swap(p,n);
print(p,lenth);
return 0;
}
相关文章推荐
- p62 练习3.3 通过只调整指针(而不是数据)来交换两个相邻的元素,使用:
- 数据结构与算法分析 c++11 练习3.2 通过只调整链(而不是数据)来交换两个相邻的元素
- 通过只调整指针(而不是数据)来交换两个相邻的元素
- 习题3.3---只通过调整指针来达到相邻结点交换的过程
- 只调整指针来交换两个相邻的元素【双链表】
- 8.通过调整链来交换两个相邻的元素
- 【Weiss】【第03章】练习3.3:通过交换指针交换单/双链表元素
- 7-6 冒泡法排序(20 分) 将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素
- 单双链表,通过指针变动交换相邻元素
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和
- 华为面试题:通过交换元素,使两个数组的元素和之差最小
- 有两个数组a,b,大小都为n,;通过交换a,b中的元素,使sum(a)-sum(b)最小。
- 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 交换单链表中相邻的两个元素 Swap Nodes in Pairs
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- 使用指针交换两个数据
- C语言指针-------通过调用函数,完成两个数值的交换
- 有两个数组a,b,大小都为n,数组元素的值任意,无序;要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- 练习2: 通过交换函数的实现,学习指针的用法。