第四周项目3-单链表应用(1)

来源:互联网 发布:吃鸡为什么不优化 编辑:程序博客网 时间:2024/06/06 07:00
问题代码:
/* * Copyright (c) 2016,烟台大学计算机学院 * All rights reserved. * 文件名称:qq.cpp * 作者:王译敏 * 完成日期:2016年9月7日 * 版本号:1.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 CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表    void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表    void InitList(LinkList *&L);  //初始化线性表    void DestroyList(LinkList *&L);  //销毁线性表    bool ListEmpty(LinkList *L);  //判断线性表是否为空    int ListLength(LinkList *L);  //求线性表长度    void DispList(LinkList *L);  //输出线性表    bool GetElem(LinkList *L,int i,ElemType &e);  //求线性表某个数据元素值    int LocateElem(LinkList *L,ElemType e);  //按元素值查找    bool ListInsert(LinkList *&L,int i,ElemType e);  //插入数据元素    bool ListDelete(LinkList *&L,int i,ElemType &e);  //删除数据元素    void Reverse(LinkList *&L);void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表    {        LinkList *s;        int i;        L=(LinkList *)malloc(sizeof(LinkList));        L->next=NULL;//创建头结点,其next域为NULL        for(i=0;i<n;i++)        {            s=(LinkList *)malloc(sizeof(LinkList));            s->data=a[i];//创建数据节点*s            s->next=L->next;            L->next=s;        }    }    void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表    {            LinkList *s,*r;            int i;            L=(LinkList *)malloc(sizeof(LinkList));            r=L;            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;    }                    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);    }    int ListLength(LinkList *L) //求线性表长度    {        int n=0;        LinkList *p=L;        while(p->next!=NULL)        {            n++;            p=p->next;        }        return (n);    }        bool GetElem(LinkList *L,int i,ElemType &e)  //求线性表某个数据元素值    {        int j=0;        LinkList *p=L;        while(j<i&&p!=NULL)        {            j++;            p->next;        }        if(p==NULL)            return false;        else        {            e=p->data;            return true;        }    }        int LocateElem(LinkList *L,ElemType e)  //按元素值查找    {        int i=1;        LinkList *p=L->next;        while(p!=NULL&&p->data!=e)        {            p=p->next;            i++;        }        if(p==NULL)            return (0);        else            return(i);    }        bool ListInsert(LinkList *&L,int i,ElemType e)  //插入数据元素    {        int j=0;        LinkList *p=L,*s;//p指向头结点,j置为0        while(j<i-1&&p!=NULL)        {            j++;            p=p->next;        }        if(p==NULL)            return false;        else        {            s=(LinkList *)malloc(sizeof(LinkList));            s->data=e;            s->next=p->next;            p->next=s;            return true;        }    }        bool ListDelete(LinkList *&L,int i,ElemType &e)  //删除数据元素    {        int j=0;        LinkList *p=L,*q;        while(j<i-1&&p!=NULL)        {            j++;            p=p->next;        }        if(p==NULL)            return false;        else        {            q=p->next;            if(q==NULL)                return false;            e=q->data;            p->next=q->next;            free(q);            return true;        }    }    void DispList(LinkList *L)  //输出单链表    {        LinkList *p=L->next;//p开始指向节点        while(p!=NULL)        {            printf("%d ",p->data);            p=p->next;        }        printf("\n");    }    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;    }

运行结果:


知识点总结:

单链表的基本运算

学习心得:

加油!


0 0
原创粉丝点击