[C++]顺序表与链表的基本操作

原创 2018年04月17日 21:45:25

顺序表:

#include <stdio.h>
#include <stdlib.h>

// 函数结果状态码
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status; // Status是函数返回值类型,其值是函数结果状态码

#define MAXSIZE 1024 // 顺序表可能达到的最大长度

typedef int ElemType; // 元素数据类型

typedef struct {
    ElemType *elem; // 指向数据元素的基地址
    int length; // 当前长度
}SqList; // 顺序表

/* 顺序表基本操作,序号i从1开始 */
// 销毁
void destroyList(SqList &L){
    free(L.elem);
    L.elem = NULL;
} 

// 根据用户输入,创建n个元素的表 
Status createList(SqList &L,int n)
{
    L.elem = new ElemType[MAXSIZE];
    if(!L.elem) exit(OVERFLOW);
    for(int i = 1; i <= n; i++)
        scanf("%d",&L.elem[i]);
    L.length = n;
    return OK;
}

// 遍历,打印表中元素 
void traverseList(SqList L)
{
    for(int i = 1; i <= L.length; i++)
        printf("%d ",L.elem[i]);
}

// 取值,将序号i的元素存入e 
Status getElem(SqList L, int i, ElemType &e)
{
    if(i < 1 || i > L.length) return ERROR;
    e = L.elem[i];
    return OK;
}

// 查找,返回元素e的序号 
int locateElem(SqList L, ElemType e)
{
    for(int i = 1; i <= L.length; i++)
        if(L.elem[i] == e) return i;
    return 0; 
}

// 插入 
Status listInsert(SqList &L, int i, ElemType e)
{
    if((i < 1) || (i > L.length + 1)) return ERROR;
    if(L.length == MAXSIZE) return ERROR;
    for(int j = L.length; j >= i; j--)
        L.elem[j+1] = L.elem[j];
    L.elem[i] = e;
    ++L.length;
    return OK;
}

// 删除 
Status listDelete(SqList &L, int i)
{
    if((i < 1) || (i > L.length)) return ERROR;
    for(int j = i; j <= L.length - 1; j++)
        L.elem[j] = L.elem[j+1];
    --L.length;
    return OK;
}

int main(){
    SqList list;
    int e, n, m;
    scanf("%d",&n);
    createList(list,n);
    scanf("%d",&m);
    if(getElem(list,m,e) == OK){ //把 e 赋值为链表里的第 m 个数 
        printf("The value of e is %d\n",e);
    }else{
        printf("There is no m number in the list.\n");
    }
    scanf("%d", &e);
    if(locateElem(list,e)){
        printf("The index of %d is %d\n",e,locateElem(list,e));
    }else{
        printf("There is no number %d in the list.\n",e);
    }
    scanf("%d %d",&m,&e); // 插入元素 e 到第 m 个位置 
    if(listInsert(list,m,e) == OK){
        traverseList(list); 
    }else{
        printf("Insert Error\n");
    }
    scanf("%d",&m); // 删除第 m 个元素 
    if(listDelete(list,m) == OK){
        traverseList(list); 
    }else{
        printf("Delete Error\n");
    }
    destroyList(list);
}

链表:

#include <stdio.h>
#include <stdlib.h>

// 函数结果状态码
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status; // Status是函数返回值类型,其值是函数结果状态码

typedef int ElemType; // 元素数据类型 

typedef struct LNode
{
    ElemType data; // 数据域
    struct LNode *next; // 指针域
}LNode,*LinkList;

/* 基本操作,序号i从1开始 */
// 遍历,打印表中元素 
Status createList(LinkList &L,int n)
{
    L = new LNode;
    L->next = NULL;
    LNode *r = L;
    for(int i = 0; i < n; i++)
    {
        LNode *p = new LNode;
        scanf("%d",&p->data);
        p->next = NULL;
        r->next = p;
        r = p;
    }
}

Status getElem(LinkList L, int i, ElemType &e)
{
    LNode *p = L->next;
    int j = 1;
    while(p && j < i)
    {
        p = p->next;
        ++j;
    }
    if(!p || j > i) return ERROR;
    e = p->data;
    return OK;
}

int locateElem(LinkList L, ElemType e)
{
    LNode *p = L->next;
    int i = 1;
    while(p && p->data != e)
    {
        i++;
        p = p->next;
    }
    if(!p) return 0;
    return i;
}

Status listInsert(LinkList &L, int i, ElemType e)
{
    LNode *p = L;
    int j = 0;
    while(p && (j < i - 1))
    {
        p = p->next;
        ++j;
    }
    if(!p || j > i - 1) return ERROR;
    LNode *s = new LNode;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

Status listDelete(LinkList &L, int i)
{
    LNode *p = L;
    int j = 0;
    while((p->next)&&(j < i - 1))
    {
        p = p->next;
        ++j;
    }
    if(!(p->next) || (j > i - 1)) return ERROR;
    LNode *q = p->next;
    p->next = q->next;
    delete q;
    return OK;
}

void traverseList(LinkList L){
    LNode *p = L->next;
    while(p){
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

int main(){
    LinkList list;
    int cmd, result, e, n, i;
    scanf("%d", &n); 
    createList(list, n);
    while (~scanf("%d", &cmd) && cmd!=-1) { // 选择操作 
        switch (cmd) {
        case 0:         // 取值
            scanf("%d", &i);
            result = getElem(list, i, e);
            if (result) printf("%d\n", e);
            else printf("Failed\n");
            break;
        case 1:         // 查找
            scanf("%d", &e);
            result = locateElem(list, e);
            if (result) printf("%d\n", result);
            else printf("Failed\n");
            break;
        case 2:             // 显示 
            traverseList(list);
            break;
        case 3:             // 插入 
            scanf("%d%d", &i, &e);
            result = listInsert(list, i, e); 
            if (result) printf("Succeed\n");
            else printf("Failed\n");
            break;
        case 4:             // 删除 
            scanf("%d", &i);
            result = listDelete(list, i); 
            if (result) printf("Succeed\n");
            else printf("Failed\n");
            break;
        default:
            printf("Unknown Command.\n");
            break;
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Aless0/article/details/79981419

顺序表和单链表的基本操作

大一,快考试了,复习一下。
  • Leo_Coding
  • Leo_Coding
  • 2015-06-15 00:12:46
  • 818

顺序表的基本操作实现

顺序表的基本操作实现 在复习的时候顺便写写代码(基本和书上的一样) #include #include #define OK 1 #define ERROR 0 #define Sta...
  • Cai_Nia
  • Cai_Nia
  • 2016-11-14 22:06:46
  • 266

数据结构:顺序表的ADT(C语言描述)

数据结构:顺序表ADT 顺序表的实现: #define MAXSIZE 1024 //顺序表可能的最大长度,假设为1024 typedef int elemtype; //其中的int型可以更改为任...
  • qq_39316701
  • qq_39316701
  • 2017-10-20 19:41:56
  • 86

C++数据结构之线性顺序表基本操作

#include using namespace std; #define MAX_SIZE 20 typedef int ElemType; typedef struct {  ElemType ...
  • u014687749
  • u014687749
  • 2015-04-25 20:08:47
  • 722

顺序表基本操作的代码实现:C++实现

顺序表基本操作的代码实现
  • yybmec
  • yybmec
  • 2015-08-30 16:17:06
  • 7095

用C++实现顺序表的基本操作

  • 2011年03月27日 02:36
  • 3KB
  • 下载

【C++/数据结构】顺序表的基本操作

#include using namespace std; typedef enum{ FALSE, TRUE }Status; template class SeqList { public:...
  • qaz3171210
  • qaz3171210
  • 2015-08-22 15:27:44
  • 764

C++实现顺序表的基本操作

头文件:#ifndef List_H #define List_Htypedef int Elem; class List{ public: List(int size); ...
  • DR_eamMer
  • DR_eamMer
  • 2017-06-20 18:19:20
  • 477

C++顺序表的基本操作

C++顺序表的基本操作 1.由a的n个元素建立顺序表 2.初始化顺序表 3.销毁顺序表 4.判断顺序表是否是空表,若为空返回TRUE,否则返回FALSE 5.求顺序表的长度 6.输出顺序表...
  • lt1598552894
  • lt1598552894
  • 2015-09-14 08:56:57
  • 589

用C++编写的顺序表基本操作

  • 2010年10月17日 18:59
  • 1.63MB
  • 下载
收藏助手
不良信息举报
您举报文章:[C++]顺序表与链表的基本操作
举报原因:
原因补充:

(最多只允许输入30个字)