/*
* : , 。
* 。
* :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("
");
}
//
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;
}