链表的基本表示操作

//链表:

#include <iostream>
using namespace std;
//定义结点:
struct NODE
{
    int data;//数据域
    NODE *next;//指针域
};
//链表类:
class LIST
{
    NODE *head;
public:
    //构造函数
    LIST()
    {
        head = new NODE;//申请结点空间
        head->next = NULL;//指针域设为空
    }

    void readInit(int n);
    int getByNum(int n);
    int getByData(int data);
};
//创建链表
void LIST::readInit(int n)
{
    cout << "请输入"<< n << "个结点值" << endl;
    int data;
    for(int i = 0; i < n; i++)
    {
        cin >> data;
        NODE *newNode = new NODE;//为每一个结点申请空间
        newNode->data = data;
        newNode->next = NULL;//指针域设置为空

        NODE *cur = head;//又定义一个数组指针指向表头
        while(cur->next)
        {
            cur = cur->next;
        }
        cur->next = newNode;
    }
}
//通过序号查找数值:
int LIST::getByNum( int n )
{
    int i = 0;
    NODE* cur = head;
    while(cur->next && i < n)
    {
        cur = cur->next;

//不断地把后面的指针域赋值给前面的;直到i=n也就是当找到需要的元素时
        i++;
    }
    return cur->data;//输出要查找的元素
}
//通过数值查找序号:
int LIST::getByData( int data )
{
    int i = 0;
    NODE *cur = head;//为什么都要把head放到*cur里面?
    while(cur->next)
    {
        cur = cur->next;
        i++;//用来记录序号数,然后如果找到就把这个序号输出
        if(cur->data == data)
        {
            return i;
        }
    }
    return -1;
}
int main()
{
    int n, i, data;
    LIST list;
    cout << "请输入要建立的链表长度" << endl;
    cin >> n;
    list.readInit(n);
    cout << "请输入要查询的链表序号" << endl;
    cin >> i;
    cout << "第" << i << "个结点值为" << list.getByNum(i) << endl;

    cout << "请输入要查询的结点值" << endl;
    cin >> data;
    i = list.getByData(data);
    if(i == -1)
    {
        cout << "找不到该结点" << endl;
    }
    else
    {
        cout << "该结点值位于第" << i << "位" << endl;
    }
    system("pause");
    return 0;
}
时间: 2024-10-01 03:36:52

链表的基本表示操作的相关文章

【数据结构】两个单循环链表的连接操作

如果在单链表或头指针表示的链表上操作这个比较消耗性能,因为都需要遍历第一个链表,找到an,然后将b1链接到an的后面,时间复杂度是:O(n).若在尾指针表示的单循环链表上实现,则只需改变指针,无需遍历,时间复杂度是:O(1) 现在看算法实现,需要4个主要步骤,都注释了: LinkList Connect(LinkList A,LinkList B){ //假设A,B为非空循环链表的尾指针 LinkList p = A->next;//1.保存A链表的头结点的位置 A->next = B->

C语言复习——指针 链表 与 文件操作

刚刚进入大二,准备开始学习C++,对大一所学的C语言一次练习,正好也是赶上老师布置的任务,用C语言写一个  销售管理系统  ,就尽可能的把所学的都用上,也就是结构,指针,文件操作,还有数据结构,本次加入了链表. 用两个函数 Load_LinkList() 和 Save_LinkList() 让链表与文件操作结合,除了打印函数,其他都是在内存中操作链表,这样写更有条理,在创建链表时没有采用书上的用一个中间变量引导,并插入到结点前面,而是直接在链表尾的next申请内存,便于理解,操作也方便. /*首

复习一下单链表的常用操作

复习一下单链表的常用操作,包括单链表的创建.插入.删除.排序.逆置以及打印输出等. #include<IOSTREAM> using namespace std; typedef struct Single_link { int data; struct Single_link *next; }node; //单链表的创建 node *Create() { node *head,*p,*s; int x,cycle=1; head=(node *)malloc(sizeof(node)); p

单链表的基础操作

单链表中节点的查找.插入.删除.求单链表长度等操作. 按序号查找结点值 在单链表中从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点指针域NULL. 按序号查找结点值的算法如下: LNode GetElem(LinkList L,int i){ //本算法取出单链表L(带头结点)中第i个位置的结点指针 int j=1; //计数,初始为1 LNode *p = L->next; //头结点指针赋给p if(i==0) return L; //若i等于0,

有序链表的插入操作

C语言教材的有序单链表程序的插入我并不满意,因为链表为空,表尾等原因导致有四种情况要处理,给同学们的阅读造成困难.书上的做法较复杂的一个原因是链表是不带头结点的,所以要考虑新结点插入时会不会变成表头, 例如:当链表为空时, 插入3, 3变成表头,  再插入1, 链表为1->3, 链表头指向1, 代码必须处理这样的情况. 第一部分: 不含头结点的链表插入的非常规思路 下面我给出另外一个思路,新结点一律插入表头,这样就不要考虑链表为空的情况了.但是可能无序,可以从表头开始,相邻节点不符合次序要求交换

Java链表的删除操作

刚开始接触java时很长一段时间, 总觉得java链表的删除操作自己写的有bug. 第一个bug版本: 仅接removeByForlist.remove(j)之后应该显示调用i-- public static void testRemoveByFor() { List<Integer> removeByForlist = Lists.newArrayList(1, 1, 1, 1, 1, 1, 1, 1, 1, 1); System.out.println(ToStringBuilder.re

链表的常见操作(转)

链表的常见操作 链表是数据结构的重要内容,在计算机程序中应用广泛,同时也是各公司笔试题目的重点. 以下简单实现了链表的一些操作,包括创建.增加节点.删除节点.单链表逆置.合并有序链表等. 一.链表创建 链表主要有三种形式,包括单链表.双链表和循环链表. 单链表每个节点只包含一个后驱指针,双链表节点同时包含一个前驱指针和一个后驱指针,循环链表的尾节点的后驱指向头节点. 代码如下: /*单链表节点结构*/typedef struct NodeType{char elem; NodeType *nex

带头节点的单链表的插入操作

1.偶然看到了十字链表的应用,想到之前在<数据结构与算法分析>的链表一章中,需要用多重表实现一个简单的查询功能.功能需求如下: “已知 学生 和 学校课程 总数 分别为 40000 和 2500,现在需要得到两份报告,一份显示每门课成注册的所有学生信息, 一份显示每个学生注册了哪些课程.” 显然可以用一个 40000 * 2500 个元素的二维数组来解决,但是每个学生选课数目很少,因此会浪费很多空间.因此选择十字链表来实现. 既然是链表,那么肯定要有插入操作,于是便有了本文.算是对功能实现前的

双链表内部迁移操作

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 所谓双链表的迁移操作指的是将双链表中一部分连续的结点迁移到另外一个结点之前,为了说明这个定义,我们从下图来解释. 我们将[first,last)对应的结点迁移到position所指向的位置之前?那该怎么做呢?这不是一个算法设计题,因为不需要什么特别有效率的技巧,我只是想理清这个思路而已,因为双链表的增删操作如果不理清思路会很容易产生混乱. 下面我们给出该双链表结点的定义: template<class T> struct node { <