第四周项目2-建设“单链表”算法库

来源:互联网 发布:猫 益生菌 知乎 编辑:程序博客网 时间:2024/05/29 12:30

问题及代码:

/*copyright (t) 2016,烟台大学计算机学院*All rights reserved.*文件名称:1.cpp*作者:车金阳
*完成日期:2016年10月9日*版本号:v1.0*问题描述:建立单链表"算法库",实现单链表的基本运算*输入描述:无*程序输出:无*/

linklist.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 DestroyList(LinkList *&L);                   //销毁单链表void DispList(LinkList *L);                       //输出单链表void InitList(LinkList *&L);                      //初始化单链表(即创建一个头节点)bool ListEmpty(LinkList *L);                      //判断单链表是否为空表int ListLength(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);  //删除数据元素

linklist.cpp:

#include <stdio.h>#include <malloc.h>#include "linklist.h"void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表{    LinkList *s;    int i;    L=(LinkList *)malloc(sizeof(LinkList));    L->next=NULL;    for(i=0;i<n;i++)    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=a[i];        s->next=L->next;          //s指针域指向原来L的后继节点        L->next=s;                //L的指针域指向新插入的s    }}void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表{    LinkList *s,*r;               //头指针*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];        r->next=s;        r=s;    }    r->next=NULL;                    //到尾}void DestroyList(LinkList *&L) //销毁单链表{    LinkList *pre=L,*p=L->next;    while(p!=NULL)    {        free(pre);                     //释放*pre节点        pre=p;        p=pre->next;                   //“跟随”,同步后移    }    free(pre);                         //循环结束时pre已指向尾节点,释放尾节点,完成销毁}void DispList(LinkList *L)  //输出单链表{    LinkList *p=L->next;    while(p!=NULL)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n");}void InitList(LinkList *&L)  //初始化单链表(即创建一个头节点){    L=(LinkList *)malloc(sizeof(LinkList));    L->next=NULL;}bool ListEmpty(LinkList *L)   //判断单链表是否为空表{    return (L->next!=NULL);}int ListLength(LinkList *L)  //求单链表长度{    int length=0;    LinkList *p=L;           //长度初始化为0,p指向头节点    while(p->next!=NULL)    {        length++;        p=p->next;    }    return length;}bool GetElem(LinkList *L,int i,ElemType &e)      //求线性表中某个数据元素值{    int j=0;    LinkList *p=L;                               //p指向头节点,j(头节点序号)置0    while(j<i && p!=NULL)    {        j++;        p=p->next;    }    if(p==NULL)                                  //不存在第i个数据节点,返回false        return false;    else                                         //存在第i个数据节点,返回true    {        e=p->data;        return true;    }}int LocateElem(LinkList *L,ElemType e)           //按元素值查找元素{    int i=1;    LinkList *p=L->next;                         //p指向头节点,i(头节点序号)置1    while(p!=NULL && p->data!=e)                 //查找data值为e的节点,其序号为i    {        p=p->next;        i++;    }    if(p==NULL)                                  //不存在元素值为e的节点,返回0        return 0;    else                                         //存在元素值为e的节点,返回逻辑序号i        return i;}bool ListInsert(LinkList *&L,int i,ElemType e)   //插入数据元素{    int j=0;    LinkList *p=L,*s;                            //p指向头节点,j(头节点序号)置0    while(j<i && p!=NULL)                        //遍历查找第i-1个节点    {        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,*s;    while(j<i && p!=NULL)    {        j++;        p=p->next;    }    if(p==NULL)    {        return false;    }    else    {        s=p->next;                               //s指向第i个节点        if(s==NULL)                              //第i个节点不存在,无法删除            return false;        else        {            e=s->data;            p->next=s->next;                     //删除*q节点            free(s);                             //释放*q节点            return true;                         //成功删除第i个节点        }    }}

main.cpp:

#include <stdio.h>#include <malloc.h>#include "linklist.h"int main(){    LinkList *L;    ElemType a[8]= {7, 9, 8, 2, 0, 4, 6, 3};    ElemType e;    int i;    InitList(L);    printf("该表已被初始化\n");    if(ListEmpty(L))        printf("该表为非空表\n");    else        printf("该表为空表\n");    CreateListF(L, a, 8);    printf("头插法建表结果:");    DispList(L);    if(ListEmpty(L))        printf("该表为非空表\n");    else        printf("该表为空表\n");    printf("该表长度为:%d\n\n",ListLength(L));    DestroyList(L);    InitList(L);    CreateListR(L, a, 6);    printf("尾插法建表结果:");    DispList(L);    printf("该表长度为:%d\n\n",ListLength(L));    //接下来对尾插法建立的单链表进行操作    for(i=1;i<=ListLength(L)+4;i++)                 //测试第i个节点找到和找不到的情况    {        if(GetElem(L,i,e))            printf("找到第%d个元素,其值为:%d\n",i,e);        else            printf("第%d个元素未找到!\n",i);    }    printf("\n");    for(i=0;i<=ListLength(L)+4;i++)                 //测试第i个节点找到和找不到的情况    {        if(LocateElem(L,i))            printf("找到元素%d,它是表中的第%d个元素\n",i,LocateElem(L,i));        else            printf("元素%d未找到!\n",i);    }    printf("\n");    ListInsert(L,0,12);                             //测试成功插入和无法插入的情况    printf("插入元素12后表中各元素为:");    DispList(L);    ListInsert(L,4,15);    printf("插入元素15后表中各元素为:");    DispList(L);    ListInsert(L,8,17);    printf("插入元素17后表中各元素为:");    DispList(L);    ListInsert(L,12,26);    printf("插入元素26后表中各元素为:");    DispList(L);    ListDelete(L,0,e);                               //测试成功删除和无法删除的情况    printf("删除第1个节点后表中各元素为:");    DispList(L);    ListDelete(L,3,e);    printf("删除第4个节点后表中各元素为:");    DispList(L);    ListDelete(L,6,e);    printf("删除第6个节点后表中各元素为:");    DispList(L);    ListDelete(L,10,e);    printf("删除第10个节点后表中各元素为:");    DispList(L);    DestroyList(L);    return 0;}

运行结果:

知识点总结:

        单链表的基本运算

心得体会:

        通过自建单链表算法库,结合抽象内容可视化,巩固了基本运算相关思路与算法,并为此部分内容的灵活运用打下了坚实基础。

0 0