线性表之链式表基本操作

来源:互联网 发布:笔记本怎么用梯子 知乎 编辑:程序博客网 时间:2024/05/21 10:43

LinkList.h

#ifndef LINKLIST_H_INCLUDED#define LINKLIST_H_INCLUDED//单链表的存储结构typedef char ElemType;typedef struct LNode{    ElemType date;//存放元素值    struct LNode * next;//指向后继节点}LinkList;//双链表的存储结构typedef struct DNode{    ElemType date;//存放元素值    struct DNode *prior;//指向前驱节点    struct NNode *next;//指向后继节点}DLinkList;#endif // LINKLIST_H_INCLUDED
main.cpp

#include <iostream>#include <stdio.h>#include <stdlib.h>#include "LinkList.h"using namespace std;//头插法建表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->date=a[i];        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->date=a[i];        r->next=s;        r=s;    }    r->next=NULL;}//初始化线性表void InitList(LinkList *&L){    L=(LinkList*)malloc(sizeof(LinkList));    L->next=NULL;}//销毁线性表void DestroyList(LinkList *&L){    LinkList * pre=L,*p=L->next;    while(p!=NULL)    {        free(pre);        pre=p;        p=pre->next;    }    free(pre);}//判断线性表是否为空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;}//输出线性表void DispList(LinkList *L){    LinkList *p=L->next;    while(p!=NULL)    {        printf("%c",p->date);        p=p->next;    }    printf("\n");}//求线性表中某个元素的值bool GetElem(LinkList *L,int i,ElemType &e){    int j=0;    LinkList *p=L;    while(j<i&&p!=NULL)    {        j++;        p=p->next;    }    if(p==NULL)        return false;    else    {        e=p->date;        return true;    }}//按元素值查找int LocateElem(LinkList *L,ElemType e){    int j=0;    LinkList *p=L->next;    while(p!=NULL&&p->date!=e)    {        p=p->next;        j++;    }    if(p==NULL)        return 0;    else    {        return j;    }}//插入数据元素bool ListInsert(LinkList *&L,int i,ElemType e){    int j=0;    LinkList *s,*p=L;    while(j<i-1&&p!=NULL)    {        j++;        p=p->next;    }    if(p==NULL)        return false;    else    {        s=(LinkList*)malloc(sizeof(LinkList));        s->date=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->date;        p->next=q->next;        free(q);        return true;    }}int  main(){LinkList *h;ElemType e;printf("单链表的基本运算如下:\n");printf("  (1)初始化单链表h\n");InitList(h);printf("  (2)依次采用尾插法插入a,b,c,d,e元素\n");ListInsert(h,1,'a');ListInsert(h,2,'b');ListInsert(h,3,'c');ListInsert(h,4,'d');ListInsert(h,5,'e');printf("  (3)输出单链表h:");DispList(h);printf("  (4)单链表h长度=%d\n",ListLength(h));printf("  (5)单链表h为%s\n",(ListEmpty(h)?"空":"非空"));GetElem(h,3,e);printf("  (6)单链表h的第3个元素=%c\n",e);printf("  (7)元素a的位置=%d\n",LocateElem(h,'a'));printf("  (8)在第4个元素位置上插入f元素\n");ListInsert(h,4,'f');printf("  (9)输出单链表h:");DispList(h);printf("  (10)删除h的第3个元素\n");    ListDelete(h,3,e);printf("  (11)输出单链表h:");DispList(h);printf("  (12)释放单链表h\n");DestroyList(h);return 0;}
运行结果:




0 0
原创粉丝点击