C语言实现链表基本操作(交换第i个和第j个节点)
2020-07-21 04:13
1441 查看
当i或者j为1时,需要让链表的表头指向j。
代码为
/*i和j为1时情况比较特殊,需要让表头重新指向交换后的那个节点*/ if (i == 1) { t1 = *L; for (m = 1; temp->Next != NULL; m++, temp = temp->Next) { if (m + 1 == j) { *L = temp->Next; t2 = temp->Next->Next; temp->Next->Next = t1->Next; t1->Next = t2; temp->Next = t1; } } }
当i和j都不为1时。
节点相邻与不相邻也是不一样的。
不相邻的情况下就是让i前面的节点指向j,然后让j前面的节点指向i。如果两个节点相邻(假设i < j)j前面的节点就是i,j前面的节点指向i就是指向了自己,所以要分开写。
不相邻节点时:
代码为:
if ((i - j) != 1 && (j- i) != 1) {//非相邻结点之间交换 for (m = 1; temp->Next != NULL; m++, temp = temp->Next) { if (m + 1 == i) { t1 = temp; } if (m + 1 == j) { t2 = temp; } } t5 = t1->Next->Next; t3 = t1->Next; t4 = t2->Next; t1->Next = t4; t2->Next = t3; t3->Next = t4->Next; t4->Next = t5; }
最后一种情况,两个节点相邻:
代码为:
for (m = 1; temp != NULL; m++, temp = temp->Next) { if (m + 1 == i) { t1 = temp; } if (m == j) { t2 = temp; } } temp = t2->Next; t3 = t1->Next; t1->Next = t2; t3->Next = temp; t2->Next = t3; }
全部代码:
#include <stdio.h> #include <malloc.h> typedef struct node { int Score; struct node * Next; }Node, * List; void Insert(List *L, Node e) { List temp = *L; List n = (List)malloc(sizeof(Node)); n->Score = e.Score; if (temp == NULL) { *L = n; } else { while (temp->Next != NULL) { temp = temp->Next; } temp->Next = n; } n->Next = NULL; } void Swap(List * L, int i, int j) { List temp = *L; List t1; List t2; List t3; List t4; List t5; int m; /*i和j为1时情况比较特殊,需要让表头重新指向交换后的那个节点*/ if (i == 1) { t1 = *L; for (m = 1; temp->Next != NULL; m++, temp = temp->Next) { if (m + 1 == j) { *L = temp->Next; t2 = temp->Next->Next; temp->Next->Next = t1->Next; t1->Next = t2; temp->Next = t1; } } }if (j == 1) { t1 = *L; for (m = 1; temp->Next != NULL; m++, temp = temp->Next) { if (m + 1 == i) { *L = temp->Next; t2 = temp->Next->Next; temp->Next->Next = t1->Next; t1->Next = t2; temp->Next = t1; } } } /*相邻节点之间交换和非相邻结点之间交换不一样*/ else { if ((i - j) != 1 && (j- i) != 1) {//非相邻结点之间交换 for (m = 1; temp->Next != NULL; m++, temp = temp->Next) { if (m + 1 == i) { t1 = temp; } if (m + 1 == j) { t2 = temp; } } t5 = t1->Next->Next; t3 = t1->Next; t4 = t2->Next; t1->Next = t4; t2->Next = t3; t3->Next = t4->Next; t4->Next = t5; }else if (i < j) {//相邻节点之间交换 for (m = 1; temp != NULL; m++, temp = temp->Next) { if (m + 1 == i) { t1 = temp; } if (m == j) { t2 = temp; } } temp = t2->Next; t3 = t1->Next; t1->Next = t2; t3->Next = temp; t2->Next = t3; }else if (i > j) { for (m = 1; temp != NULL; m++, temp = temp->Next) { if (m + 1 == j) { t1 = temp; } if (m == i) { t2 = temp; } } temp = t2->Next; t3 = t1->Next; t1->Next = t2; t3->Next = temp; t2->Next = t3; } } } void printflist(List list) { List temp; for (temp = list; temp != NULL; temp = temp->Next) { printf("%d\n", temp->Score); } } void freelist(List *list) { List temp = *list, del; while (temp != NULL) { del = temp; temp = temp->Next; free(del); } } int main() { List list = NULL; Node n1, n2, n3, n4, e;//定义5个节点 e.Score = 5; n1.Score = 1; n2.Score = 2; n3.Score = 3; n4.Score = 4; Insert(&list, n1); Insert(&list, n2); Insert(&list, n3); Insert(&list, n4); Insert(&list, e); // dellist(&list, 8); Swap(&list, 5, 4); printflist(list); freelist(&list); return 0; }
相关文章推荐
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- C语言实现单链表(带头结点)的基本操作
- C语言实现单链表——之基本操作1
- 树的基本结构,以及利用链表实现树的各项操作(创建、添加/删除/打印树节点、销毁等等)
- Java单链表基本操作(九)--交换相邻节点对的值
- 单链表的基本操作大全之C语言实现(二)
- 用c语言实现单链表的基本操作
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- C语言 双链表的基本操作与实现
- 数据结构--单链表的基本操作(C语言实现)
- C语言实现单链表的基本操作及其部分面试题
- 算法与数据结构-单向链表的基本操作C语言实现
- 单链表基本操作C语言实现
- 双向链表的C语言实现与基本操作(二)
- 八.二叉树各种操作的C语言实现 深度遍历求深度,广度遍历求深度,交换左右子树,求叶子节点数
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- c语言实现双向链表的基本操作
- C语言实现无头链表的基本操作
- C语言实现双向链表的基本操作