您的位置:首页 > 其它

第4周项目3- 单链表算法(1)

2015-09-25 09:25 288 查看
/*Copyright (c) 2015, 烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名称:H1.cpp
* 作者:辛志勐
* 完成日期:2015年9月25日
* 版本号:vc6.0
* 问题描述:设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)
*           的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。
* 输入描述:无
* 程序输出:链表的结果
*/

 

#include <stdio.h>

#include <malloc.h>

typedef int ElemType;

typedef struct LNode        //定义单链表结点类型

{

    ElemType data;

    struct LNode *next;     //指向后继结点

}LinkList;

void InitList(LinkList *&L);  //初始化线性表

void DestroyList(LinkList *&L);  //销毁线性表

bool ListEmpty(LinkList *L);  //判断线性表是否为空

void DispList(LinkList *L);  //输出线性表

bool ListDelete(LinkList *&L,int i,ElemType &e);  //删除数据元素

void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表

 

void InitList(LinkList *&L)

{

    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点

    L->next=NULL;

}

void DestroyList(LinkList *&L)

{

    LinkList *p=L,*q=p->next;

    while (q!=NULL)

    {

        free(p);

        p=q;

        q=p->next;

    }

    free(p);    //此时q为NULL,p指向尾结点,释放它

}

bool ListEmpty(LinkList *L)

{

    return(L->next==NULL);

}

void DispList(LinkList *L)

{

    LinkList *p=L->next;

    while (p!=NULL)

    {

        printf("%d ",p->data);

        p=p->next;

    }

    printf("\n");

}

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];

        r->next=s;          //将*s插入*r之后

        r=s;

    }

    r->next=NULL;           //终端结点next域置为NULL

}

void Reverse(LinkList *&L)

{

    LinkList *p=L->next,*q;

    L->next=NULL;

    while (p!=NULL)     //扫描所有的结点

    {

        q=p->next;      //让q指向*p结点的下一个结点

        p->next=L->next;    //总是将*p结点作为第一个数据结点

        L->next=p;

        p=q;            //让p指向下一个结点

    }

}

int main()

{

    LinkList *L;

    ElemType a[]= {1,3,5,7, 2,4,8,10};

    CreateListR(L,a,8);

    printf("L:");

    DispList(L);

    Reverse(L);

    printf("逆置后L: ");

    DispList(L);

    DestroyList(L);

    return 0;

}



 

知识点总结:尾插法考察,使用while循环置换函数。

学习心得:本次练习对尾插法做了复习,又体验了c语言中的函数顺序交换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: