数据结构学习日记2:实现一个简单的线性表功能(链式存储方式)

数据结构学习日记,此次是用链表来实现一个线性表的功能

// ListTable1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;


//声明一个节点
typedef struct Node
{
    ElemType data;
    Node *next;
} Node;

typedef struct Node *NodePoint;

typedef int *int1;

//获取第x个元素的值返回给e
Status GetElem(Node *list,int x,ElemType *e)
{
    //循环指针
    Node *p;
    //计数
    int j = 1;
    p = list->next;
    while(p&&j <x)
    {
        p = p->next;
        j++;
    }

    if (!p || j > x)
    {
        return ERROR;
    }
    *e = p->data;
    return OK;
}

//单链表的插入操作
Status InsertList(Node *list, int x, ElemType e)
{
    //NodePoint 指向Node的指针类型,用来声明Node指针类型变量
    //Node *p;
    NodePoint p;
    int i = 1;
    p = list->next;
    while(p&&i < x-1)
    {
        p = p->next;
        i++;
    }
    if (!p || i > x)
    {
        return ERROR;
    }
    

    //第一种:
    //Node s;
    //Node *q;

    //第二种
    NodePoint q;

    q = (NodePoint)malloc(sizeof(Node));
    
    //第三种
    //Node *n;
    //n=new Node();   注意这里new出来的是地址;

    //第四种
    //q = (Node *)malloc(sizeof(Node));


    q->data = e;
    q->next = p->next;
    p->next = q;
    return OK;
}

//获取链表的长度
int GetLength(NodePoint list)
{
    NodePoint p;
    p = list;
    int i = 1;

    while (p)
    {
        p = p->next;
        i++;
    }
    return i;
}

//对表中的数据进行初始化
Status InitList(NodePoint list, int length)
{
    //判断内存是否满

    //第一步:先初始化一个节点
    //q相当于一个游标,只存取第一个元素的位置
    srand(1);
    ElemType value;
    value = rand() % 9;


    NodePoint s = (NodePoint)malloc(sizeof(Node));
    if (!s)
    {
        return ERROR;
    }
    list->next = s;

    s->next = NULL;
    s->data = value;

    //第二步:
    //前插法
    for (int i = 1; i < length; i++)
    {
        NodePoint p = (NodePoint)malloc(sizeof(Node));
        if (!p)
        {
            return ERROR;
        }
        p->data = rand() % 9;

        p->next = list->next;
        list->next = p;
    }

    ////后插法:
    //NodePoint last;//尾指针相当于游标
    //last = s;
    //for (int i = 0; i < length; i++)
    //{
    //    NodePoint p = (NodePoint)malloc(sizeof(Node));
    //    p->data = rand() % 9;
    //    last->next = p;
    //    last = p;

    //}

    return OK;
}


//删除表中的元素
Status DeleteList(NodePoint ftNodePoint,int x,ElemType *e)
{
    NodePoint p;
    NodePoint q;
    p = ftNodePoint;
    q = p;
    int i=0;

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

    if (!p || i>x)
    {
        return ERROR;
    }


    //取出p中的数据
    *e = p->data;
    q->next= p->next;

    //释放p
    free(p);

    return OK;
    

}

//清空表中的数据
Status ClearList(NodePoint list)
{
    NodePoint p,cursor;
    p = list->next;
    //cursor = p->next;
    if (!p)
    {
        return ERROR;
    }

    while (p)
    {
        /*free(p);
        p = cursor;
        if (cursor)
        {
            cursor = cursor->next;
        }
        else
        {
            break;
        }*/

        cursor = p->next;
        free(p);
        p = cursor;
    }

    list->next = NULL;
    return OK;
}


//遍历链表中的数据输出
Status CheckList(Node list)
{
    if (!list.next)
    {
        return ERROR;
    }

    NodePoint p;
    p = list.next;

    while (p)
    {
        cout << p->data << "	";
        p = p->next;
    }
    cout << endl;
    return OK;
}

int main()
{

    /*int1 p;
    int x = 9;
    p = &x;
    cout << *p << endl;*/

    Node list;
    cout << "初始化:" << InitList(&list, 10) << endl;

    ElemType value;
    cout << "获取:"<<GetElem(&list, 9, &value) << endl;;
    cout << "value:" << value << endl;

    //增加一个数据
    cout << InsertList(&list, 9, 66) << endl;

    cout << CheckList(list) << endl;

    cout << DeleteList(&list, 9, &value) << endl;
    cout << value << endl;

    cout << CheckList(list) << endl;

    cout << ClearList(&list) << endl;

    cout << CheckList(list) << endl;

    system("pause");
    return 0;
}

  以上是自己学习过程中的日记。

原文地址:https://www.cnblogs.com/springword/p/6078665.html