您的位置:首页 > 编程语言 > C语言/C++

【C语言】链表逆序

2017-10-28 16:42 281 查看
链表有:有头链表、无头链表

1、有头单链表的创建

#include <stdio.h>
#include<stdlib.h>
typedef struct Node         //结构体 自定义类型
{
int data;
struct Node*next;
}Node;
void Init(Node** list)                  //头节点初始化
{
*list = (Node*)malloc(sizeof(Node));
(*list)->next = NULL;
}
void Pushback(Node**list,int d)         //尾插节点
{
Node*ret = (*list)->next;
Node*newNode = (Node*)malloc(sizeof(Node));
if (newNode)
{
newNode->data = d;
newNode->next = NULL;
}
if (ret==NULL)
{
(*list)->next = newNode;
return;
}
while (ret->next)
{
ret = ret->next;
}
ret->next = newNode;
}
void Popback(Node**list)         //尾删节点
{
Node*temp = NULL;
Node*ret = *list;
ret = ret->next;
if (ret == NULL)
return;
else
{
while (ret->next)
{
temp = ret;
ret = ret->next;
}
free(temp->next);
temp->next = NULL;
}
}
void Display(Node *list)       //显示函数
{
Node*ret = list->next;
while (ret)
{
printf("-->%d ",ret->data);
ret = ret->next;
}
printf("\n");
}


有头链表逆序函数

void Reverse(Node**list)      //有头链表逆序
{
Node*ret = (*list)->next;
(*list)->next = NULL;
Node*p = NULL;
while (ret)
{
p = ret->next;
ret->next = (*list)->next;
(*list)->next = ret;
ret = p;
}
}
在主函数中调用

int main()
{
Node*mylist;
Init(&mylist);
Pushback(&mylist, 1);
Pushback(&mylist, 2);
Pushback(&mylist, 3);
Pushback(&mylist, 4);
Display(mylist);
Reverse(&mylist);
Display(mylist);
system("pause");
return 0;
}



2、无头单链表创建

#include <stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
}Node;
void Init(Node** list)
{
*list = NULL;
}
void PushBack(Node **list,int d)     //尾插
{
Node*ret = *list;
Node*newNode = (Node*)malloc(sizeof(Node));
if (newNode)
{
newNode->data = d;
newNode->next = NULL;
}
if (ret == NULL)
{
*list = newNode;
}
else
{
while (ret->next)
{
ret = ret->next;
}
ret->next = newNode;
}
}
void Popback(Node**list)     //尾删
{
Node*temp=NULL;
Node*ret = *list;
if (*list == NULL)
return;
while (ret->next)
{
temp = ret;
ret = ret->next;
}
free(temp->next);
temp->next = NULL;
}
void Display(Node* list)      //显示函数
{
if (list == NULL)
return;
while (list)
{
printf("--->%d ", list->data);
list = list->next;
}
printf("--->end");
printf("\n");
}
无头单链表逆序函数

void Reverse(Node**list)        //无头链表逆序
{
Node*ret = *list;
Node*p = NULL;
Node*q = NULL;
while (ret)
{
p = ret->next;
ret->next = NULL;
ret->next = q;
q = ret;
ret = p;
}
*list = q;
}
在主函数中调用

int main()
{
Node* mylist;
Init(&mylist);
PushBack(&mylist,1);
PushBack(&mylist,2);
PushBack(&mylist,3);
PushBack(&mylist,4);
PushBack(&mylist, 5);
Display(mylist);
Reverse(&mylist);
Display(mylist);

system("pause");
return 0;
}



注:

1.在主函数中创建的是一个自定义类型的指针类型的变量

2.在传参时只要是对链表进行改动的函数,都要传二级指针(上述代码 Node** 类型)

3.显示函数不需要对链表进行更改,所以传一级指针就可以了(上述代码 Node*
类型)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: