69,371
社区成员
发帖
与我相关
我的任务
分享
SList* reverse_1(SList *P)
{
//头插逆置
assert(P->first != NULL);
SList l2;
SListInit(&l2);
SListNode* cur = P->first;
while (cur != NULL)
{
SListPushFront(&l2, cur->data);
cur = cur->next;
}
return &l2;
}
如果要实现单向链表逆置,可以用辅助栈,没必要重新创建节点并复制数据
#pragma once
typedef int SLDataType;
typedef struct SListNode
{
int data;
struct SListNode* next;
}SListNode;
typedef struct SList
{
struct SListNode* first;
}SList;
//初始化&销毁
void SListInit(SList* list);
//销毁
void SListDestroy(SList* list);
//头插
void SListPushFront(SList* list, SLDataType data);
//头删
void SListPopFront(SList* list);
//打印
void SListPrint(SList* list);
//尾插
void SListPushBack(SList* list, SLDataType data);
//尾删
void SListPopBack(SList* list);
//查找
SListNode* SListFind(SList* list, SLDataType data);
//在pos位置的节点后插入元素
void SListInsertAfter(SListNode* pos, SLDataType data);
//删除pos位置后的第一个节点
void SListEraseAfter(SListNode* pos);
//删除遇到的指定的第一个节点
void SListRemove(SList* list, SLDataType data);
//逆置
SListNode* reverse_1(SList *P);
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
//初始化
void SListInit(SList* list)
{
assert(list != NULL);
list->first = NULL;
}
//销毁
void SListDestroy(SList* list)
{
SListNode* next;
SListNode* cur;
for (cur = list->first; cur != NULL; cur = next)
{
next = cur->next;
free(cur);
}
list->first = NULL;
}
//头插
void SListPushFront(SList* list, SLDataType data)
{
SListNode* node = (SListNode*)malloc(sizeof(SListNode));
assert(node);
node->data = data;
node->next = list->first;
//更新头指针的指向;
list->first = node;
}
//头删
void SListPopFront(SList* list)
{
SListNode* old_first = list->first;
assert(list); //有无链表
assert(list->first != NULL); //有链表,链表里是否有元素,
//若链表为空,则删除失败
list->first = list->first->next;
free(old_first);
}
//打印
void SListPrint(SList* list)
{
SListNode* cur;
assert(list);
for (cur = list->first; cur != NULL; cur = cur->next)
{
printf("%d-->", cur->data);
}
printf("NULL\n");
}
//尾插
void SListPushBack(SList* list, SLDataType data)
{
SListNode* node = (SListNode*)malloc(sizeof(SListNode));
SListNode* lastone = list->first;
assert(list != NULL);
for (; lastone->next != NULL; lastone = lastone->next)
{
}
assert(node != NULL);
node->data = data;
node->next = lastone->next;
lastone->next = node;
}
//尾删
void SListPopBack(SList* list)
{
SListNode* cur;
SListNode* m;
assert(list != NULL);
assert(list->first != NULL);
if (list->first->next == NULL)
{
//若链表为空,则尾删即为头删
SListPopFront(list);
return;
}
for (cur = list->first; cur->next->next != NULL; cur = cur->next)
{
}//找到倒数第二个节点
m = cur->next;
cur->next = m->next;
free(m);
}
//查找
SListNode* SListFind(SList* list, SLDataType data)
{
SListNode* cur = list->first;
for (; cur != NULL; cur = cur->next)
{
if (cur->data == data)
{
return cur;
}
}
return NULL;
}
//在pos位置的节点后插入元素
void SListInsertAfter(SListNode* pos, SLDataType data)
{
SListNode* node = (SListNode*)malloc(sizeof(SListNode));
assert(node != NULL);
node->data = data;
node->next = pos->next;
pos->next = node;
}
//删除pos位置后的第一个节点
void SListEraseAfter(SListNode* pos)
{
SListNode* node = pos->next->next;
free(pos->next);
pos->next = node;
}
//删除遇到的指定的第一个节点
void SListRemove(SList* list, SLDataType data)
{
SListNode* prev = NULL;
SListNode* cur = list->first;
while (cur != NULL && cur->data != data)
{
prev = cur;
cur = cur->next;
}
//要删除的节点不存在
if (cur == NULL)
{
return;
}
//要删除的节点若就是第一个节点
if (prev == NULL)
{
//即头删
SListPopFront(list);
return;
}
prev->next = cur->next;
free(cur);
}
SListNode* reverse_1(SList *P)
{
//头插逆置
assert(P->first != NULL);
SList l2;
SListInit(&l2);
SListNode* cur = P->first;
while (cur != NULL)
{
SListPushFront(&l2, cur->data);
cur = cur->next;
}
return l2.first;
}
void test()
{
SList l1;
SListInit(&l1);
SListPushFront(&l1, 1);
SListPushFront(&l1, 2);
SListPushFront(&l1, 3);
SListPushFront(&l1, 4);
SListPrint(&l1);
SList l2;
l2.first = reverse_1(&l1);
SListPrint(&l2);
}
int main()
{
test();
system("pause");
return 0;
}