第2章 线性表的链式表示
综合应用题 第25题
#include <stdio.h>
#include <stdlib.h> //malloc所在头文件
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct node {
ElemType data; //单链表中的数据域
struct node *next; //单链表的指针域
}NODE, *LinkList;
//带头结点单链表的初始化
LinkList LinkListInit() {
NODE *L;
L = (NODE *)malloc(sizeof(NODE)); //申请结点空间
if (L == NULL) { //判断是否有足够的内存空间
cout<<"申请内存空间失败\n";
exit(0);
}
L->next = NULL; //将next设置为NULL,初始长度为0的单链表
return L;
}
//单链表的建立2,尾插法建立带头结点的单链表
/*思路:1.单链表的初始化
2.定义一个始终指向终端节点的结点r,开始时赋值为头结点
3.对每个结点:数据域赋值;指针域指向r指向的下一个结点,并使r指向该结点,r等于该结点
*/
LinkList LinkListCreatT(ElemType *a, int n) {
NODE *L;
L = LinkListInit(); //初始化一个空链表
NODE *r;
r = L; //r始终指向终端结点,开始时指向头结点
NODE *p;
for (int i = 0; i < n; i++){
p = (NODE *)malloc(sizeof(NODE)); //申请新的结点
if (p == NULL) { //判断是否有足够的内存空间
cout<<"申请内存空间失败\n";
exit(0);
}
p->data = a[i]; //结点数据域赋值
p->next = r->next;
r->next = p; //将结点插入到表头L-->|1|-->|2|-->NULL
r = p;
}
return L;
}
void change_List(NODE *L)
{
NODE *p,*r,*q,*s;
p=q=L;
while(q->next!=NULL)
{
p=p->next;
q=q->next;
if(q->next!=NULL)
q=q->next;
}
q=p->next;
p->next=NULL;
while(q!=NULL)
{
r=q->next;
q->next=p->next;
p->next=q;
q=r;
}
s=L->next;
q=p->next;
p->next=NULL;
while(q!=NULL)
{
r=q->next;
q->next=s->next;
s->next=q;
s=q->next;
q=r;
}
/*检查算法输出
for (s= L->next; s != NULL; s = s->next) {
cout<<s->data<<" ";
}
cout<<endl;*/
}
int main() {
LinkList list, start;//, listverse;
int array[8] = { 1, 2, 5, 4, 5, 6, 7, 8 };
cout<<"输出单链表的数据:";
list=LinkListCreatT(array,8);
for (start = list->next; start != NULL; start = start->next) {
cout<<start->data<<" ";
}
cout<<endl;
change_List(list);
return 0;
}