【学習点滴-データ構造-単一鎖表】交換単鎖表の任意の2つの要素


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