单向链表如何逆序

1、什么是单向链表(单链表结构)?

线性表的链式存储结构,即链表。

将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,通过地址或指针建立它们之间的联系,所得到的存储结构为链表结构。

百度百科单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
列表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。
2、单向链表如何逆序?

例如:建立一个包含若干整数的单向链表,实现数据的逆转。(比如说把1,2,3,4,5逆转成5,4,3,2,1)

实现思路:可以通过一个空链表来实现

程序自定义头文件

#ifndef __MYHEAD_H__
#define __MYHEAD_H__

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//定义宏
#define datatype int

//定义结构体
typedef struct link_list {
    datatype num;
    struct link_list * next;
}linkList,*pLinkList;

//函数声明
extern void linklist_init(pLinkList *Q);   /*初始化*/
extern void linklist_insert(pLinkList p,pLinkList newone); /*插入*/
extern bool linklist_delete(pLinkList p); /*删除*/
extern bool is_empty(pLinkList p); /*判断*/
extern void linklist_show(pLinkList p); /*遍历*/
extern void linklist_inverse(pLinkList p); /*反转*/
extern void linklist_create(pLinkList h); /*创建*/

#endif 

未逆序时代码:

#include "myhead.h"

/**
 * 初始化
 * @Author        AWEEN
 * @CreateTime    2018/5/17 15:26
 */
void linklist_init(pLinkList *Q){
    *Q = (pLinkList)malloc(sizeof(linkList));
    if(NULL == *Q){
        perror("malloc failed");
        exit(1);
    }
    (*Q)->next = NULL;
}

/**
 * 插入
 * @Author        AWEEN
 * @CreateTime    2018/5/17 15:33
 */
void linklist_insert(pLinkList p,pLinkList newone){
    newone->next = p->next;
    p->next = newone;
}

/**
 * 删除
 * @Author        AWEEN
 * @CreateTime    2018/5/17 15:36
 */
bool linklist_delete(pLinkList p){
    pLinkList t;
    //判断
    if(p->next == NULL)
    {
        printf("删除失败。表已空\n");
        return false;
    }
    //删除算法
    t = p->next;
    p->next = t->next;
#if 0
    free(t);
    t = NULL;
#endif
    return true;
}

/*判断*/
bool is_empty(pLinkList p){
    if(p->next == NULL)
        return true;
    else
        return false;
}
/*遍历*/
void linklist_show(pLinkList head){
    pLinkList t;
    for(t=head->next;t!=NULL;t=t->next)
        printf("%d\t",t->num);
    printf("\n");
}

//创建一个链表
void linklist_create(pLinkList h)
{
    int n,i;
    pLinkList new,p=h;
    printf("请输入你要创建的链表个数:");
    scanf("%d",&n);
    for(i=0;i<n;i++) {
        new = (pLinkList)malloc(sizeof(pLinkList));
        if(NULL == new) {
            perror("new malloc failed");
            exit(1);
        }
        printf("请输入一个新数据:");
        scanf("%d",&new->num);
        //将新节点插入到链表中
        linklist_insert(p,new);
        //每插入依次,往后移动一下
        p = p->next;
        //每插入一次  查看一次
        linklist_show(h);
    }
}

Makefile:

CC=gcc
CFLAGS = -Wall -g -O0
SRC = mian.c link_list.c
BIN = mian

$(BIN):$(SRC)
     $(CC) -o $(BIN) $(SRC)
clean:
    $(RM) $(BIN) .*.sw?

实现逆序的函数:

/*反转*/
void linklist_inverse(pLinkList h){
    //将原链表分成两个表,一个空表,一个数据表
    pLinkList p,t;
    p = h->next;    /*数据表*/
    h->next = NULL;    /*空表*/
    while(p != NULL){
        t = p;
        p = p->next;
        linklist_insert(h,t);
        linklist_show(h);
    }
}

程序测试:

#include "myhead.h"

int main() {
    pLinkList head;
    linklist_init(&head);
    linklist_create(head);
    linklist_inverse(head);
    return 0;
}

结果输出:

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值