建立单链表并交换表中任意两个元素
2017-03-12 15:08
316 查看
/* *功能:建立单链表并交换表中任意两个元素 *@time:2017年3月12日15:07:25 */ #include <stdlib.h> #include <stdio.h> #include <malloc.h> typedef struct node { int pos; int data; node* next; }*LinkList,*linkNode; LinkList CreateList_H(); //创建链表 void printList(LinkList L); //打印链表 LinkList findPoint(const LinkList head,int pos); //找到指定结点 LinkList findPre(const LinkList head,const LinkList node);//找到前结点 void swapPoint(linkNode head,linkNode node1,linkNode node2);//交换目标结点 int getLength(LinkList ); //获得链表长度 int posInput(int n); //要找的结点位置 int main(void) { LinkList L,head_n,head_m; int n,m,t,length; L = CreateList_H(); length = getLength(L); printList(L); n = posInput(length); m = posInput(length); if(n>m) { t = n; n = m; m = t; } head_n = findPoint(L,n); head_m = findPoint(L,m); swapPoint(L,head_n,head_m); printList(L); return 0; } int posInput(int n) { int num; printf("请输入你要交换的结点编号,"); printf("结点编号应该大于0,小于%d\n",n); scanf("%d",&num); while(num<=0 || num>n) { printf("结点编号应该大于0,小于%d\n",n); scanf("%d",&num); } return num; } int getLength(LinkList head) { int len = 0; LinkList p = head->next; while(p!=NULL) { len++; p = p->next; } return len; } LinkList CreateList_H() { int n = 0; LinkList L = (LinkList)malloc(sizeof(node)); L->next = NULL; LinkList p = L; printf("创建几个结点:"); scanf("%d",&n); for(int i=0; i<n; ++i) { LinkList pNew = (LinkList)malloc(sizeof(node)); printf("输入第%d个节点data值:",i+1); scanf("%d",&pNew->data); pNew->pos = i+1; pNew->next = NULL; p->next = pNew; p = pNew; } return L; } void printList(LinkList L) { LinkList p = L->next; while(p!=NULL) { printf("结点%d,data = %d \n",p->pos,p->data); p = p->next; } } void swapPoint(linkNode head,linkNode node1,linkNode node2){ linkNode prenode1 = NULL; //待交换节点node1的前一个节点 linkNode postnode1 = NULL; //待交换节点node1的后一个节点 linkNode prenode2 = NULL; //待交换节点node2的前一个节点 linkNode postnode2 = NULL; //待交换节点node2的后一个节点 //头节点不交换 if (node1 == head || node2 == head){ return; } //相同不需交换 if (node1 == node2){ return; } prenode1 = findPre(head,node1); prenode2 = findPre(head,node2); postnode1 = node1->next; postnode2 = node2->next; //节点相邻情况处理 if (postnode1 == node2){ prenode1->next = node2; node2->next = node1; node1->next = postnode2; return; } //其他情况下,直接交换节点 prenode1->next = node2; node2->next = postnode1; prenode2->next = node1; node1->next = postnode2; } LinkList findPoint(const LinkList head,int pos) { LinkList node = head; for(int i=1; i<=pos; i++) { node = node->next; } return node; } LinkList findPre(const LinkList head,const LinkList node) { LinkList 4000 tmp = head; while(tmp->next!=node) { tmp = tmp->next; } return tmp; }
相关文章推荐
- 7单链表交换任意两个元素(不包括表头)
- 【学习点滴-数据结构-单链表】交换单链表中任意两个元素
- 单链表交换任意两个元素(不包括表头)
- 程序员面试题目总结--链表(7)【实现单链表交换任意两个元素(不包括表头)】
- 交换单链表中任意两个元素(不包括表头)
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 有两个序列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元素的和]之间的差最小。
- [微软]有两个序列a,b,大小都为n,序列元素的值任意整数,无序; 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 7,单链表交换任意两个元素(不包括表头)
- 交换单链表中相邻的两个元素 Swap Nodes in Pairs
- 【华为】题目:有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求: 通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
- leetcode之92. Reverse Linked List II(C++读错题版本,交换一个链表中指定的两个位置上的元素)
- 交换任意两个元素进行排序进行的最小交换次数
- 交换单链表任意两个元素(完整程序)