数据结构复习初体验

单链表 C++

目录

单链表 C++


菜鸡乱啄开始:

  • 先在.h文件中定义结点的数据结构和链表类,类中是构造函数和各种函数的声明  [我好像没写析构函数 ~那个 是叫析构8] (我有参考网上代码资料的 侵权删?(最基本的数据结构的代码讲究这个吗?我还不知道 好无知哦))
ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED

/**
 * 定义结构写在.h文件里
 * 结构中说明结点的存储结构
 * 定义类也写在.h文件里
 * 类中声明基本操作
 *
 */
struct Node{
    int data;//结点中的数据域
    struct Node *next;//结点中的指针域
};//可在此处声明变量如 node1和linkList
class LinkList {
    /**
     * 类中只是声明方法和变量(说明有这个东西),
     * 并没有实际的定义(说明他具体是什么 怎么操作)
     */
private:
    int length;
    Node *Head;//头结点
public:
    LinkList();
    /*
     * 构造函数,不写默认是不带参数的,
     * 可自己声明带参数的 和构造函数中
     * 你要求其做的事情
     */
    void CreateList_H(int n);//前插法创建链表(栈式)
    void CreateList_R(int n);//后插法创建链表(队列式)
    bool InsertList(int i, int data);//插入
    bool DeleteList(int i);//删除指定结点上的数据
    int GetData(int i);//根据结点序号i获取第i个结点中的元素(取值)
    int LocateElem(int elem);//返回数据域中是值elem的结点元素
    int GetLength();//获取链表长度
    void Display();//遍历整个链表

};


#endif // LINKLIST_H_INCLUDED
  • 再新建一个.cpp文件(最好与.h文件同名,这个样子比较好认好找,知道哪个是哪个辣),在这个cpp文件中定义.h中声明的函数。
#include <iostream>
#include "LinkList.h"
using namespace std;

/** 在.h文件中声明的函数在此处进行定义 **/
/*
 *(1)作用域限定符,当在类体中直接定义函数时,
 *   不需要在函数名字的前面加上类名,
 *   但是在类体外实现函数定义的时候,
 *   必须加上类名并且加上作用域限定符。Student::Display();
 *
 *(2)静态数据成员既可以通过对象名引用,也可以通过类名加::来引用,
 */

//构造函数
LinkList::LinkList(){
    Head = new Node;
    /**
      *定义头结点(注意头结点和首元结点的区别,
      *头结点是空结点,首元结点是第一个元素
      *头指针指向头结点
      */
    Head->next = nullptr;//头结点指针置空
    length = 0;
}
//前插法创建链表
/**
  * 前插法是新添加的元素永远在第一个,也就是在头结点之后
  */
void LinkList::CreateList_H(int n){
    //LinkList L = new LinkList();
    Node *temp = Head;//现在temp是一个指向头结点的指针
    Node *p;
 //   L.Head = nullptr;
    for(int i=0; i<n; i++){
        p = new Node;
        cout << "请输入链表中倒数第" << i+1 << "个元素的值:" <<endl;
        cin >> p->data;
        p->next = temp->next;//
        temp->next = p;
        length++;
    }
}
//后插法创建链表
void LinkList::CreateList_R(int n){
    //LinkList L = new LinkList();
    Node *temp = Head;
    Node *p;
    for(int i=0; i<n; i++){
        p = new Node;
        cout << "请输入链表中第" << i+1 << "个元素的值:" <<endl;
        cin >> p->data;
        p->next = nullptr;
        temp->next = p;
        temp = p;
        length++;
    }
}
//插入
bool LinkList::InsertList(int i, int elem){
    Node *temp = Head;
    Node *p = new Node;
    p->data = elem;
    int j=0;
    while(temp && j<i-1){
        temp = temp->next;
        j++;
    }
    if(!temp || j>(i-1)){
        cout << "INSER ERROR" << endl;
        return false;
    }
    else{
        p->next = temp->next;
        temp->next = p;
        length++;
        cout << "HAVE INSERTED" <<endl;
        return true;
    }
}
//删除
bool LinkList::DeleteList(int i){
    Node *p = Head;//头结点开始往下遍历
    Node *temp;//用于暂时存放要被删除的结点
    int j = 1;
    while(p && j<=i-1){
        p = p->next;
        j++;
    }
    if(j>i || !p){
        cout << "DELETE ERROR" << endl;
        return false;
    }else{
        temp = p->next;
        p->next = temp->next;
        length--;
        cout << "HAVE DELETED" <<endl;
        return true;
        }
}
//获取元素
int LinkList::GetData(int i){
    Node *p = Head;
    int j = 0;
    while(p && j<i){
        p = p->next;
        j++;
    }
    if(!p || j>i){
        cout << "GET ELEMENT ERROR" << endl;
        return -1;
    }else{
        cout << "GET ELEMENT OK" << endl;
        return p->data;
    }

}
//查找第一个元素值为elem的值并返回其结点个数
int LinkList::LocateElem(int elem){
    Node *p = Head;
    int j = 1;
    while(p && p->data!=elem){
        p = p->next;
        j++;
    }
    if(p && p->data==elem){
        cout << "ELEMENT HAVE BEEN FOUND" << endl;
        return j;
    }else if(!p || j > length){
        cout << "ELEMENT HAVE NOT BEEN FOUND" << endl;
        return -1;
    }
}
//返回长度
int LinkList::GetLength(){
    return length;
}
//遍历整个链表
void LinkList::Display(){
    Node *p = Head;
    for(int i=1; i<=length; i++){
        p = p->next;
        cout << p->data << ends;
    }
}

还有main文件咯~  在main里进行运行,建议是写完一个函数debug一次鸭(好小白)

#include <iostream>
#include "LinkList.h"


using namespace std;




int main()
{
    LinkList l;
    l.CreateList_R(5);
     //cout << l.Head->next->next->data << endl;
    //l.InsertList(2, 6);
    //cout << l.Head->next->data << endl;
    l.DeleteList(1);
    //cout << l.Head->next->next->data << endl;
    //int a = l.GetData(5);
    //cout << a <<endl;
    //int b = l.LocateElem(61);
    //cout << b << endl;
    int lenth = l.GetLength();
    cout << "Length is:" << lenth << endl;
    l.Display();
    return 0;
}

qiang~~ 单链表打卡,下一个写 循环链表还是双链表捏?

(这到底算不算原创鸭????)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值