第四周 项目3 【单链表应用1】

本文介绍了一种单链表逆置算法的实现方法,并通过一个具体的实例展示了如何使用尾插法建立单链表,然后对该链表进行逆置操作。最后给出了运行结果和作者的心得体会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*       
Copyright (c)2016,烟台大学计算机与控制工程学院       
All rights reserved.       
文件名称:项目3--单链表应用(1).cpp       
作    者:李潇      
完成日期:2016年9月18日       
版 本 号:v1.0       
       
问题描述:1、设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置, 
          即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。实现这个算法,并完成测试。 
输入描述:若干数据 。     
程序输出:链表中的数据及逆序拍好后的数据。  
*/  
//主函数main.cpp的代码
#include<iostream>
using namespace std;
#include<stdio.h>
#include"list.h"
int main()
{
    LinkList *L;
    ElemType a[8]= {1,3,4,6,8,9,10,7};
    CreateListR(L,a,8);
    printf("L:");
    DispList(L);
    Reverse(L);
    printf("逆置后L: ");
    DispList(L);
    DestroyList(L);
    return 0;
}
//头文件list.h的代码
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;//int类型 运用typedef方便快捷
typedef struct LNode
{
    ElemType data;
    struct LNode *next;//定义单链表节点类型
}LinkList;
void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表
void DispList(LinkList *L);//输出线性表
void DestroyList(LinkList *&L); //销毁线性表
void Reverse(LinkList *l);
#endif // LIST_H_INCLUDED
//函数实现list.cpp的代码
#include"list.h"
void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表
{
   LinkList *s,*r;
    int i;
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点
    L->next=NULL;
    r=L;                    //r始终指向终端结点,开始时指向头结点
    for (i=0; i<n; i++)//循环建立数据节点
    {
        s=(LinkList *)malloc(sizeof(LinkList));
        s->data=a[i];            //创建数据结点*s
        r->next=s;          //将*s插入*r之后
        r=s;
    }
    r->next=NULL;           //终端结点next域置为NULL
}
void DispList(LinkList *L)//输出线性表
{
     LinkList *p=L->next;//p指向开始节点
    while (p!=NULL)//p不为NULL,输出*p节点的data域
    {
        printf("%d ",p->data);
        p=p->next;//p移向下一个节点
    }
    printf("\n");
}

void DestroyList(LinkList *&L) //销毁线性表
{
   LinkList *pre=L,*p=L->next;//pre指向*p的前驱节点
    while (p!=NULL)//扫描单链表L
    {
        free(pre);//释放*pre节点
        pre=p;    //pre 、p同步后移一个单位
        p=pre->next;
    }
    free(pre);//循环结束后,p为NULL,pre指向尾节点,释放它
}
void Reverse(LinkList *l)
{
    LinkList *p,*q;
    p=l->next;
    l->next=NULL;
    while(p!=NULL)
    {
        q=p->next;
        p->next=l->next;
        l->next=p;
        p=q;
    }
}
运行结果:
<img src="https://img-blog.youkuaiyun.com/20160918162236157?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
知识点总结:根据头插法尾差法的特点完成链表逆载
心得体会:加深了对单链表的尾差法和头插法的理解和应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值