//进行单链表的逆置
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct LNode
{
struct LNode *next;
int data;
}LNode,*LinkList;
//进行单链表初始化
bool InitList (LinkList &L){
L = (LNode*)malloc(sizeof(LNode));//生成一个LNode类型的结点,并使得L指向它
if (L==NULL) //内存不足,分配失败
{
return false;
}
L->next = NULL; //将其初始化为一个空表
return true;
}
//(带头结点)从已知链表当中取数据,并将其逆置进另一个链表当中,L为原链表,S为新链表
void Revervse(LinkList &L,LinkList &S){
LNode *p,*q,*b;
q = L->next;p = S;
while (q != NULL)
{
b = (LNode*)malloc(sizeof(LNode));
b->data = q->data;
b->next = p->next;
p->next = b;
q = q->next;
}
}
int main()
{
LinkList L;//声明一个指针,并且在后续将其指向单链表
InitList (L);
LinkList S;
InitList(S);
int a[8]={1,2,3,4,5,6,7,8};
LNode *s;
for (int i = 0; i <7; i++)
{
s = (LNode*)malloc(sizeof(LNode));
s->data = a[i];
if (L->next != NULL)
{
s->next = L->next;
L->next = s;
}
else
{
s->next = NULL;
L->next = s;
}
}
Revervse(L,S);
free(s);
free(L);
free(S);
return 0;
}
注意点:
①使用头插法创建链表时,必须得使用循环为每个结点malloc一块存储空间,否则会使得每次循环都只对一个结点进行操作,使得最后链表值都会一样。
②若需要保留对参数值的修改并返回结构,需要使用“&"。(因为&作为参数时C++语法,所以创建文件时得选择.cpp)
③使用指针指向链表时,必须使用例如:p = p->next,来进行指针的移动,而不是简单的p++移动指针,因为链表的物理内存空间不是连续的,并不能保证使用p++就会指向链表中的下一个元素。