单链表的一些ADT实现代码

#include<iostream>
using namespace std;
typedef struct LinkNode {
    int data;
    LinkNode* next;

}LNODE, * PNODE;
typedef struct LinkList {
    PNODE head;
    int length;

}Llist ;

//初始化
Llist* Initlist() {
    Llist* mylist = new Llist;  //申请空间
    mylist->length = 0;
    mylist->head = new LNODE;

    mylist->head->data = 0;
    mylist->head->next = NULL;

    return mylist;

}
//判空单链表
void isEmpty(Llist* list) {
    if (list == NULL)
        cout << "链表已空!";
    else {
        cout << "链表未空!";
    }


}
//清空单链表
void Emptlize(Llist* list) {
        list->length = 0;
        cout << "链表已经清空!";
  
}
//销毁(删除)单链表
void DestroyList(Llist* list) {
    list = NULL;
    cout << "链表已被销毁!";


}
//获得链表的长度
int SizeList(Llist* list) {
    if (list == NULL) {
        cout << "链表已空长度为0";
    }
    int i = 1;
    PNODE pCurrent = new LNODE;
    pCurrent = list->head->next;
    while (pCurrent != NULL) {
        pCurrent = pCurrent->next;
        i++;

    }
    return i;
}
//返回第一个节点
void* Returnfirst(Llist* list) {
    return list->head->next;

}
//插入元素(找到前驱)
void Insertelem(Llist* list, int data, int pos) {
    if (list == NULL)
        return;
    if (!data)
        return;
    if (pos<0 || pos>list->length) {
        pos = list->length;

    }
    PNODE s = new LNODE;
    s->data = data;
    s->next = NULL;
    PNODE pCurrent = list->head;
    for (int i = 0; i < pos; i++)
    {
        pCurrent = pCurrent->next;
    }
    s->next = pCurrent->next;
    pCurrent->next = s;

    list->length++;


}
//删除元素(找到前驱)
void Deleteelem(Llist* list, int pos) {
    if (list == NULL)
        return;
    if (pos<0 || pos>list->length) {
        pos = list->length;

    }
    PNODE pCurrent = new LNODE;a
    pCurrent = list->head;
    for (int i = 1; i <pos; i++)
    {
        pCurrent = pCurrent->next;
    }
    PNODE pDel = pCurrent->next;
    pCurrent->next = pDel->next;
    free(pDel);
    list->length--;
    
}
//根据位置查找元素(返回元素值)
int FindByPos(Llist* list, int pos) {
  if (list == NULL) {
        exit(1);

    }
  if (pos<0 || pos>list->length) {
      cout << "没有该元素的位置";

}
  PNODE pCurrent = new LNODE;
  pCurrent = list->head->next;
  int i = 0;
  while (i != pos) {
      pCurrent = pCurrent->next;

  }
  return pCurrent->data;

}
//根据值查找元素的位置 (返回位置)
int FindByValue(Llist* list, int data) {
  
    if (!data) {
        cout << "没有该数字";
        exit(1);
    }
    PNODE pCurrent = new LNODE;
    pCurrent = list->head->next;
    int i = 1;
    while (pCurrent != NULL) {
        pCurrent = pCurrent->next;
        i++;
        if (pCurrent->data = data) {
            break;
        }
    }
    
    return i;
}
//打印并遍历当前单链表
void Traverse(Llist* list) {
    if (list == NULL) {
        return;

    }
    PNODE pCurrent = new LNODE;
  int i= 0;
    pCurrent = list->head->next;
    while (pCurrent != NULL) {
        i++;
        cout << pCurrent->data<<" ";
        pCurrent = pCurrent->next;
    }

}



int main() {
    int data, i, n;
    Llist* mylist = Initlist();
    cout << "单链表创建成功,接下来你想插入几个元素?";
    cin >> n;
    cout << "那么这" << n << "个元素分别是?";
    for (i = 0; i < n; i++)
    {
        cin >> data;
        Insertelem(mylist, data, i);
    }
    cout << "您输入的元素遍历后是:";
        Traverse(mylist);
        cout << "你想删除第几个元素?";
        cin >> n;
        Deleteelem(mylist, n);
        Traverse(mylist);
        cout << "现在返回第一个元素节点";
        Returnfirst(mylist);

}

其实也不算是一个博客,更像是一篇日志:上面是代码展示,基本把可以实现的ADT都自己手敲了一遍,估计只有我学了几个月C语言和C++今天才整出一个自己写的代码,555不过终究还是相信努力会有回报,有几个ADT没有在main函数里面体现的。关于这个如何从平常的C语言跳到比较”高阶“的数据结构,会比较难,建议搞清楚几个概念再来自己手撸一遍这样的代码

1、结构体的关键词 什么是typedef 什么是struct 两个连起来用会怎么样

2.结构体运用的作用是什么?这个概念我觉得单独看会比较难,可以将理解为类比为C++和java的类,(因为我认为学面向对象对于人类来说是更好理解的)其实结构体和类一样,目的就是用一种抽象的数据类型将其包装起来,例如你手中有苹果 西瓜 草莓,而你把他抽象化成:“水果”,这就是一种封装的思想,而这水果就是结构体,就是类,就是抽象数据类型,水果中的苹果,西瓜,草莓,就是结构体里面的数据类型(相当于起到一个打包的作用)

3.指针,其实C语言也没学懂,C++也没咋地的我强烈认为:指针这个东西的概念一定要弄明白,指针就是放地址的东西,至于为什么说学指针难,涉及到的就是和内存有关的东西了

4.内存,强烈建议学指针先搞明白电脑里面是怎么分配内存这个东西的,对你学好指针,动态的内存分配显得尤为重要。

5.你把1234慢慢地参透,感觉你就可以开始学这个了,有些人一天就懂了,有些人三天就懂了。这东西也不是因人而异的,说白了,你天天往这个地方砸时间,多看别人的文章,CSDN这么多好人,一个个地帮忙去问,他们都很热心,真的投入个两星期,我觉得你学的比我还快,我之前快走了5个月的弯路,现在才慢慢地有了眉目,希望有问题的小伙伴少走弯路吧(毕竟东西你学了却学不进去的感觉是很难受的)(还要考试,你想逃避,于是天天干别的,这样不行,听我的一定要改正!)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值