D_S 单链表的基本操作

//  main.cpp

#include <iostream>

using namespace std;

#include "Status.h"

#include "LinkList.h"

int main()

{

    LinkList L;

    int n,i;

    ElemType e;

    InitList(L);

    cout<<" L=";

    ListTraverse(L);

    cout<<" 请设置将向线性表L中输入的元素个数:";

    cin>>n;

    CreateList(L,n);

    cout<<" L=";

    ListTraverse(L);

    cout<<" L的表长为:"<<ListLength(L)<<endl;

    cout<<" 请输入想要获取的元素位序:";

    cin>>i;

    if(GetElem(L,i,e)) cout<<" 第"<<i<<"个元素为:"<<e<<endl;

    else cout<<" 第"<<i<<"个元素不存在!"<<endl;

    cout<<" 请输入要查找的元素:";

    cin>>e;

    if((i=(LocateElem(L,e)))) cout<<" 元素"<<e<<"的位置为:"<<i<<endl;

    else cout<<" 元素"<<e<<"不存在!"<<endl;

    cout<<" 请输入插入位置和所插入元素:";

    cin>>i>>e;

    if(ListInsert(L,i,e))

    {

        cout<<" L=";

        ListTraverse(L);

    }

    else cout<<" 插入操作失败!"<<endl;

    cout<<" 请输入被删元素的位置:";

    cin>>i;

    if(ListDelete(L,i,e)) cout<<" 被删元素为:"<<e<<endl;

    else cout<<" 删除操作失败!"<<endl;

    cout<<" L=";

    ListTraverse(L);

    return 0;

}

// Status.h

#ifndef yuan_Status_h

#define yuan_Status_h

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status;

typedef int ElemType;

#endif

//  LinkList.h

#ifndef yuan_LinkList_h

#define yuan_LinkList_h

typedef struct LNode{

    ElemType data;   //结点的数据域

    struct LNode *next;  //结点的指针域

}LNode,*LinkList;  //LinkList为指向结构体LNode的指针类型

//1.单链表的初始化

Status InitList(LinkList &L)

{    //构造一个空的单链表

    L=new LNode;   //生成新结点作为头结点,用头指针L指向头结点

    L->next=NULL;  //头结点的指针域制空

    return OK;

}

//2.单链表的创建

//2.1前插法创建单链表

void CreateList(LinkList &L,int n)

{//逆位序输入n个元素的值,创建带头结点的单链表L

    L=new LNode;

    LinkList p;

    L->next=NULL; //先建立一个带头结点的空链表

    cout<<" 请输入"<<n<<"个元素:";

    for (int i=n; i>0; i--) {

        p=new LNode;  //生成新结点

        cin>>p->data;  //输入元素值

        p->next=L->next; L->next=p; //插入到表头

    }

}

//3.单链表的遍历

void ListTraverse(LinkList L)

{

    LinkList p=L->next;

    while(p) {

        cout<<p->data<<"  ";

        p=p->next;

    }

    cout<<endl;

}

//4.单链表的长度

Status ListLength(LinkList L){

    LinkList p;int j=0;

    p=L->next;

    while(p) {

        j++;

        p=p->next;

    }

    return j;

}

//5.单链表的插入

Status ListInsert(LinkList &L,int i,ElemType e)

{

    LinkList p=L,s; int j=0;

    while (p&&j<i-1) {p=p->next;++j;}

    if (!p||j>i-1)  return ERROR;

    s=new LNode;

    s->data=e;

    s->next=p->next;

    p->next=s;

    return OK;

}

//6.单链表的删除

Status ListDelete(LinkList &L,int i,ElemType &e)

{

    LinkList p=L,q;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;

    delete p;

    return OK;

}

//7.单链表的按序号查找

Status GetElem(LinkList L,int i,ElemType &e)

{//在带头结点的单链表L中查找第i个元素

    LinkList p;int j=1;p=L->next;   //初始化,p指向第一个结点,j为计数器

    while (p&&j<i) {p=p->next;++j;}

    if (!p||j>i) return ERROR;  //第i个元素不存在

    e=p->data;   //取第i个元素

    return OK;

}

//8.单链表的按值查找

Status LocateElem(LinkList L,ElemType e)

{

    LinkList p;int j=1;

    p=L->next;

    while (p&&j<=ListLength(L)) {

        if(p->data==e) return j;

        p=p->next;++j;

    }

    if (!p||j>ListLength(L)) return ERROR;

    return OK;

}

////8.单链表的按值查找

//LNode *LocateElem(LinkList L,ElemType e)

//{

//    LinkList p=L->next;

//    while (p&&p->data!=e)

//        p=p->next;

//    return p;

//}

#endif

原文地址:https://www.cnblogs.com/YuanYe1/p/5014671.html