整段代码思路如下:
1.创建一个链表List* CreateList() ,本段程序采用尾插法,为了调试方便直接使用val初始化了链表的内容。
2.遍历函数没什么好说的,基础操作。
3.Swap();有几种情况需要考虑:
(1)a b相邻的情况,(2)a b不相邻的情况(解决了这个情况(1)也就解决了)
(3)用户输入要交换的数据不在表中执行下图程序(经由Pre1与Pre2指向,若其中一个为空指针,或者均为空指针,执行printf,并且return)
if (Pre1 == NULL || Pre2 == NULL)
{
printf("Please scanf Element in List");
return;
}
(4)若用链表L = 1 2 3 4 5 6 用户输入1 2,与 2 1 。均应该正常遍历链表并且输出,本程序无论输入相邻或者不相邻的数据 是否按链表的顺序输入数据,均会正常输出。
交换元素的思路:
(1)用户输入数据后,遍历链表,为了节省遍历链表的时间中间采用break,即如果找到了a b两结点的前驱,就退出循环。
List* p = L;
while (p != NULL)
{
if (p->next->val == a) Pre1 = p;
if (p->next->val == b) Pre2 = p;
if (Pre1 != NULL && Pre2 != NULL)
break;
p = p->next;
}
(2)Pre1指向a 的前驱 Pre2指向b的前驱,
即,先修改两个前驱的指向,然后修改a b的指向,如下图:(1)(2)(3)(4)(5)
详细代码如下:
//大致思路:先修改两个前驱的next,然后修改两个结点的next
tmp = Pre1->next;
Pre1->next = Pre2->next;
Pre2->next = tmp;
tmp = Pre1->next->next;
Pre1->next->next = Pre2->next->next;
Pre2->next->next = tmp;
最终代码如下
如果有错误烦请指正,萌新小白,想要进步,谢谢大家。
有能优化的思路也烦请指出
#pragma warning (disable:4996)
#pragma warning (disable:6031)
#pragma warning (disable:6011)
#include<stdio.h>
#include<stdlib.h>
//单链表情况下
struct node
{
int val;
struct node* next;
};
typedef struct node List;
List* CreateList()
{
List* L = (List*)malloc(sizeof(List));
L->next = NULL;
List* pRear = L;
int val = 1;
while (val <= 4)
{
List* node = (List*)malloc(sizeof(List));
node->val = val;
node->next = NULL;
//将新结点插入链表
pRear->next = node;
pRear = node;
val++;
}
return L;
}
void Print(List* L)
{
List* p = L->next;
while (p != NULL)
{
printf("%d ", p->val);
p = p->next;
}
}
void Swap(int a,int b,List* L)
{
List* p = L, * Pre1= NULL, * Pre2= NULL, * Tmp = NULL,*tmp = NULL ;
while (p != NULL)
{
if (p->next->val == a) Pre1 = p;
if (p->next->val == b) Pre2 = p;
if (Pre1 != NULL && Pre2 != NULL)
break;
p = p->next;
}
if (Pre1 == NULL || Pre2 == NULL)
{
printf("Please scanf Element in List");
return;
}
if (Pre1 != NULL && Pre2 != NULL)
{//大致思路:先修改两个前驱的next,然后修改两个结点的next
tmp = Pre1->next;
Pre1->next = Pre2->next;
Pre2->next = tmp;
tmp = Pre1->next->next;
Pre1->next->next = Pre2->next->next;
Pre2->next->next = tmp;
}
}
int main()
{
int a, b;
List* L = NULL;
L = CreateList();
printf("Before Exchange:");
Print(L);
printf("\n");
printf("Please scanf two element for Exchange:");
scanf("%d %d", &a, &b);
Swap(a, b, L);
printf("\n");
printf("Exchange After:");
Print(L);
return 0;
}