【學習點滴-資料結構-單鏈表】交換單鏈表中任意兩個元素
阿新 • • 發佈:2019-02-16
/* * 演算法功能:建立單鏈表,交換單鏈表中的兩個元素。 * 演算法中的單鏈表是帶頭結點的。 * 函式說明:nop * @author:xiaoq-ohmygirl * @time :2012-06-20 **/ #include <stdio.h> #include <malloc.h> #include <stdlib.h> #define MAXNODE 10 typedef struct node{ int data; node* next; }*linkNode,*linkList; //建立帶有頭結點的單鏈表。 int createLinkList(linkList & L,int n){ L = (linkList)malloc(sizeof(linkNode)); if(!L){ return 0; } L->next = NULL; linkList p; for(int i = n;i > 0;i--){ p = (linkList)malloc(sizeof(linkNode)); scanf("%d",&p->data); p->next = L->next; L->next = p; } return 1; } void visit(linkNode node){ printf("%d->",node->data); } void getNewLine(){ printf("\n"); } //帶頭結點的單鏈表 void traverseLink(linkList L){ linkNode cur = L->next; getNewLine(); while(cur != NULL){ visit(cur); cur = cur->next; } getNewLine(); } //尋找連結串列中的第k個節點。 linkNode findNode(const linkList L,int k){ linkNode node = L; for(int i = 1;i<=k;i++){ node = node->next; } return node; } linkNode findPre(const linkList head,const linkNode node){ linkNode tmp = head; while(tmp->next != node){ tmp = tmp->next; } return tmp; } /* * 根據兩個節點的前驅,交換兩個節點 * 需要考慮的情況有: * 1.如果節點1和節點2相同,不需要交換 * 2.如果其中一個節點為頭節點,原則上不交換 * 3.如果兩個節點相鄰,需要做一些特殊處理。 * 4.其他情況下只需要找到節點的前驅,然後做相應的指標的調整。 **/ void doExchange(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; } if (postnode2 == node1){ prenode2->next = node1; node1->next = node2; node2->next = postnode1; return; } //其他情況下,直接交換節點 prenode1->next = node2; node2->next = postnode1; prenode2->next = node1; node1->next = postnode2; } main(){ linkList L; linkNode node1,node2,node3; createLinkList(L,MAXNODE); traverseLink(L); node1 = findNode(L,3); node2 = findNode(L,4); node3 = findNode(L,5); doExchange(L,node1,node2); traverseLink(L); doExchange(L,node2,node3); traverseLink(L); system("pause"); return 0; }