2208: 交换节点(线性表)
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 34 Solved: 27
[ Submit][ Status][ Web Board]
Description
(线性表)编写一个算法来交换单链表中指针P所指结点与其后继结点,HEAD是该链表的头指针,P指向该链表中某一结点。
Input
输入链表长度:6
输入链表:1 2 3 4 5 6
输入p指向的节点:5
Output
1 2 3 4 6 5
Sample Input
5
7 6 9 8 2
3
Sample Output
7 6 8 9 2
#include <stdio.h> #include <stdlib.h> #include<malloc.h> int a[100]; typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; } LinkList; void IintList(LinkList *L) { L=(LinkList *)malloc(sizeof(LinkList)); L->next=NULL; } void CreatList(LinkList *L,ElemType a[],int n) { LinkList *s,*r; int i; r=L; for(i=0; i<n; i++) { s=(LinkList *)malloc(sizeof(LinkList)); s->data=a[i]; r->next=s; r=s; } r->next=NULL; } void exchangelist(LinkList *L,int k) { LinkList *p=L,*q,*back; int i=0; while(i<k&&p->next!=NULL) { p=p->next; i++; } q=p->next; if(q!=NULL) { if(p==L) { p->next=q->next; q->next=p; L=q; } else { back=L; while(back->next!=p) back=back->next; back->next=q; p->next=q->next; q->next=p; } } } void DispList(LinkList *L) { LinkList *p=L->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } } int main() { LinkList L; int n,i,k; scanf("%d",&n); for(i=0; i<n; i++) scanf("%d",&a[i]); scanf("%d",&k); IintList(&L); CreatList(&L,a,n); exchangelist(&L,k); DispList(&L); return 0; }