单链表的存储结构及其基本操作的实现

来源:互联网 发布:网络信息部绩效考核 编辑:程序博客网 时间:2024/06/07 07:08

主要操作代码:


/*  Name: linklist.h  Copyright:   Author:   Date: 21-03-05 20:21  Description: */#ifndef LINKLIST_H_INCLUDED#define LINKLIST_H_INCLUDED#include "ds.h" //for Status,OK ...#ifndef ElemType#define ElemType int /* 数据元素类型默认为 int */#define ELEMTYPE_TAG#endif/***********************************************************  单链表的存储结构定义 ***********************************************************/typedef struct LNode {    ElemType data;    struct LNode *next;} LNode, *LinkList;/***********************************************************  单链表的基本操作声明***********************************************************///创建并初始化为空表 Status InitList(LinkList &L);//销毁整个表(从此之后不再可用) Status DestroyList(LinkList &L);//将表L置空 Status ClearList(LinkList &L);//判断表L是否为空表 bool ListEmpty(LinkList L);//求表L的长度 int ListLength(LinkList L);//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR Status GetElem(LinkList L, int i, ElemType &e);template <typename T> bool equal(T a, T b){    return a==b;}//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 //    compare(a,b) 为比较函数,匹配时返回true,否则返回false //                 这里默认使用equal进行比较 int LocateElem(LinkList L, ElemType e,       bool (*compare)(ElemType,ElemType)=equal<ElemType>);//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERRORStatus ListInsert(LinkList &L, int i, ElemType e);//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR Status ListDelete(LinkList &L, int i, ElemType &e);//遍历表L,对每个元素调用visit(x). Status ListTraverse(LinkList L, Status (*visit)(ElemType));/***********************************************************  单链表的基本操作的实现***********************************************************///创建并初始化为空表 Status InitList(LinkList &L){    // TODO (#1#): 创建空表    L=(LinkList)malloc(sizeof(LNode));    L->next=NULL;    return OK;    //-------------------------------------}//销毁整个表(从此之后不再可用) Status DestroyList(LinkList &L){        // TODO (#1#): 销毁表     L->next=NULL;    return ERROR;    //-------------------------------------}//将表L置空 Status ClearList(LinkList &L){       LinkList p;    // TODO (#1#): 清空表    while(L->next){        p=L->next;        L->next=p->next;        free(p);    }    return OK;    //-------------------------------------}//判断表L是否为空表 bool ListEmpty(LinkList L){    // TODO (#1#): 链表判空     if(L->next==NULL){        return true;    }    else{    return false;    }    //-------------------------------------}//求表L的长度 int ListLength(LinkList L){    // TODO (#1#): 链表求长度    //带头结点    int i=1;//计数器    LinkList p;    p=L->next;     while(p->next){    i++;    p=p->next;    }    return i;    //-------------------------------------}//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR Status GetElem(LinkList L, int i, ElemType &e){    // TODO (#1#): 实现取元素GetElem(L,i,&e)    //带头节点的链表    LinkList p;    p=L->next;    int j=1;    while(p&&j<i){        p=p->next;        j++;    }    if(j>i||!p){        return ERROR;    }    e=p->data;    return OK;     //-------------------------------------}//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 //    compare(a,b) 为比较函数,匹配时返回true,否则返回false int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType)){    // TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素   LinkList p;   int j;   p = L->next;    j = 1;   while(p!=NULL) {       if(compare(p->data,e))  return j;       p=p->next;       j++;   }    return 0;    //-------------------------------------}//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERRORStatus ListInsert(LinkList &L, int i, ElemType e){    // TODO (#1#): 在链表中插入元素    LinkList  p,s;    p=L;    int j=0;    while(p&&j<i-1){        p=p->next;        j++;    }    if(!p||j>i-1){        return ERROR;    }    //准备要插入的节点    s=(LinkList)malloc(sizeof(LNode));    s->data=e;    s->next=p->next;    p->next=s;    return OK;    //-------------------------------------}//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR Status ListDelete(LinkList &L, int i, ElemType &e){    // TODO (#1#): 在链表中删除元素    LinkList p,q;    p=L;    int j=0;    while(p->next&&j<i-1){        p=p->next;        j++;    }    if(!p->next||j>i-1){        return ERROR;    }    q=p->next;    p->next=q->next;    e=q->data;    free(q);    return OK;    //-------------------------------------}//遍历表L,对每个元素调用visit(x). Status ListTraverse(LinkList L, Status (*visit)(ElemType)){    LinkList p = L->next;    while ( p ) {        if ( visit(p->data)==ERROR )  return ERROR;        p = p->next;    }    return OK;}#ifdef ELEMTYPE_TAG#undef ElemType#undef ELEMTYPE_TAG#endif#endif  // LINKLIST_H_INCLUDED

运行结果演示


这里写图片描述

全代码下载:https://pan.baidu.com/s/1nvIDhbV


原创粉丝点击