一、线性链表的元素转置
参考书:《数据结构(C语言)》–严蔚敏等编著,清华大学出版社。
1、转置思想
如图:若线性链表初始化为:1,2,3,4,5
从第2个位置进行元素转置步骤:转置后的元素应为:1,5,4,3,2
(1)建立Pre指针指向1,Cur指向Pre的next(2),Next指针指向Cur的next(3);
(2)第一次循环步骤如图:
Cur->next = Next->next;
Next->next = Pre->next;
Pre->next = Next;
Next = Cur->next;
(3)第二次循环如图:Cur指向的位置不变;Pre指向的位置不变
(4)第三次循环如图:Cur指向的位置不变;Pre指向的位置不变
Next指向NULL,循环结束;
相关代码:
#include "stdio.h"
#include "stdlib.h"
//#include "LinkList.h"
#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
#define OVERFLOW -2
#define MAX_LIST_SIZE 100
#define LISTINCREMENT 10
typedef int Status;
typedef int ElemType;
typedef struct LNode {
ElemType data; //数据域(信息域)
struct LNode *next; //指针域
} LNode, *LinkList;
Status CreateList_L(LinkList &L,int n);
//构造有n个元素的有头结点的链表L
Status CreateList_L(LinkList &L,int n) {
LinkList p,q;
int i;
L = (LinkList) malloc (sizeof(LNode));
if(L==NULL) exit(OVERFLOW);
L->next = NULL;
q=L; //起初为L(头)---->NULL
for(i=1; i<=n; i++) {
p = (LinkList) malloc (sizeof(LNode));
//scanf("%d",p->data);
p->data = i; //将i值赋给p
q->next = p; //q的next指向p
p->next = NULL; //p的next指向NULL
q = q->next; //q后移
}
return OK;
}
Status ListTrans_L(LinkList &L,int i);
//在链表中从第 i个位置起进行元素转置
Status ListTrans_L(LinkList &L,int i) {
if(i<=0 || i>=5) return ERROR;
LinkList trans = (LinkList) malloc (sizeof(LNode));
if(!trans) exit(OVERFLOW);
trans=L;
LNode *Pre=trans;
for(int n=0; n<i-1; n++){
Pre=Pre->next; //指针后移直至指向i-1处
}
LNode* Cur=Pre->next; //记录当前Cur
LNode* Next=Cur->next; //记录后继Next
while (Next!=NULL){
Cur->next = Next->next;
Next->next = Pre->next;
Pre->next = Next;
Next = Cur->next;
}
return OK;
}
Status ListDisPlay_L(LNode *L);
//打印链表
Status ListDisPlay_L(LNode *L) {
LNode *p;
p = L->next; //p指向头结点
if(p == NULL) exit(OVERFLOW);
else {
while(p != NULL) {
if(p->next != NULL)
printf("%d,",p->data);
else {
printf("%d",p->data);
}
p = p->next; //p指针后移
}
}
}
int main(void) {
LinkList L;
CreateList_L(L,5);
int i;
scanf("%d",&i);
if(ListTrans_L(L,i))
ListDisPlay_L(L);
else
printf("转置位置非法\n");
return 0;
}
/*
使用单链表存储结构,实现链表的转置操作,
给出开始转置的位置,输出转置后线性表的元素。
如果转置位置不合法则输出:转置位置非法。
初始化线性表为:1,2,3,4,5
如:
输入:1 输出:5,4,3,2,1
输入:3 输出:1,2,5,4,3
输入:-4 输出:转置位置非法
*/
实现:
实现:
初始链表: 1,2,3,4,5
在第2的位置起开始转置:
在第6的位置起开始转置: