链表的建立以及各种基本操作

来源:互联网 发布:python 定义一个list 编辑:程序博客网 时间:2024/05/01 09:18
#include <iostream>using namespace std;#include <stdio.h>#include<malloc.h>#define MaxSize 50typedef char ElemType;typedef struct LNode             //定义单链表节点类型{ElemType data;           //存放元素值    LNode * next;                //指向后继节点}LinkList;void InitList(LinkList *&L)      //初始化线性表,创建头节点,使其next域置为空{    L=(LinkList *)malloc(sizeof(LinkList));    L->next=NULL;}bool ListEmpty(LinkList *L)     //判断线性表是否为空,若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);}void DispList(LinkList *L)       //输出线性表,逐一扫描链表中的每一个数据节点,并显示各节点的data值{    LinkList *p=L->next;    while(p!=NULL)    {        printf("%c",p->data);        p=p->next;    }    printf("\n");}void CreatListR(LinkList *&L,ElemType a[],int n)   //尾插法,增加一个指针r,使其始终指向链表的尾节点,并将其next域置为空{    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];        r->next=s;        r=s;    }    r->next=NULL;}bool GetElem(LinkList *L,int i,ElemType &e)    //求线性表中某个数据元素的值,从链表头开始找第i个节点,若存在第i个数据节点,则将其{    int j=0;                                   //值赋给e    LinkList *p=L;    while(j<i&&p!=NULL)    {        j++;        p=p->next;    }    if(p==NULL)    {        return false;    }    else    {        e=p->data;        return true;    }}int LocateElem(LinkList *L,ElemType e)      //按元素查找,从链表头开始找第一个值与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)   //插入数据元素  从链表中找到第i-1个节点*P,若存在这样的节点,将其值为e的节点*S插入到*p的后面{    int j=0;    LinkList *p=L,*s;    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)   //删除元素  从链表中找到第i-1个节点,若存在这个节点,且存在后继节点*q,则删除*q节点,返回true{    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 DestroyList(LinkList *&L)    //销毁线性表 释放链表L占用的内存空间,即逐一释放全部节点的空间{    LinkList * pre=L,* p=L->next;    while(p!=NULL)    {        free(pre);        pre=p;        p=pre->next;    }    free(pre);}void main()       //主函数,主要为各个函数的调用{     LinkList *L; ElemType e,a[5]={'a','b','c','d','e'};    printf("1.初始化表L\n");    InitList(L);    printf("2.采用尾插法插入a,b,c,d,e元素\n");   CreatListR(L,&a[0],5);    printf("3.输出链表L :");    DispList(L);    printf("4.链表的长度=%d\n",ListLength(L));    printf("5.链表为%s\n",(ListEmpty(L)?"空":"非空"));    GetElem(L,3,e);    printf("6.链表的第三个元素=%c\n",e);    printf("7.元素a的位置=%d\n",LocateElem(L,'a'));    printf("8,在第四个元素位置上插入元素f\n");    ListInsert(L,4,'f');    printf("9.输出链表:");    DispList(L);    printf("10.删除第三个元素\n");    ListDelete(L,3,e);    printf("11.输出链表:");    DispList(L);    printf("12.释放链表:\n");    DestroyList(L);}

0 0