3.DataStructure Cp2 T1 Singly-Linked Node

3. DataStructure Cp2 T1 Singly-Linked Node

this one is quite similar with doubly-linked linknode

singlelinknode.h
#include"stdafx.h"
#include"targetver.h"
#ifndef singlelinknode_h
#define singlelinknode_h
#include<iostream>
using namespace std;

#pragma once

template <class type>
class list
{
public://virtual function shall be put into public

    virtual void clear() = 0;
    virtual int length()const = 0;
    virtual void insert(int i, const type&x) = 0;
    virtual void remove(int i) = 0;
    virtual int search(const type&x)const = 0;//一开始以为是用来调用结构中的数字
    virtual type visit(int i)const = 0;//加在后面不会修改数据
    virtual void traverse()const = 0;


    virtual ~list();
};

class OutOfBound {};
class IllegalSize {};



template <class type>
class singlelinknode :public list<type>//<type>
{
private:

    //part I
    struct node//这个struct实际上是个class,注意构造函数
    {
        type data;
        node*next;
        node() :next(NULL){};
        node(const type& x, node*m)
        {
            data = x; next = m;/*修改完毕*/
        }
        ~node() {};//我就说不用析构函数
    };

    //partII
    node*head, *tail;
    int currentlength;

    //partIII 不写成内置类编译怎么都不通过
    node* move(int i)const
    {
        if (i<0 || i>currentlength)
            throw OutOfBound(); //at first,this hacebeen ignorant

        node*tmp = head;
        while (i>0)/*check*/
        {
            tmp = tmp->next;
            i--;
        }//应该看看是不是移动到第i个节点了,有个问题,head是第0还是第一?
        return tmp;
    }

public:

    singlelinknode();
    ~singlelinknode();

    void clear();
    int length()const;
    void insert(int i, const type&x);
    void remove(int i);
    int search(const type&x)const;//一开始以为是用来调用结构中的数字
    type visit(int i)const;//加在后面不会修改数据
    void traverse()const;

};



#endif
singlelinknode.cpp
#include "stdafx.h"
#include "singlelinknode.h"

template<class type>//不知道写什么?为head tail申请空间,随后再连一起
singlelinknode<type>::singlelinknode()
{
    head = new node;
    tail = new node;
    head->next = tail;/*check*/
    currentlength = 0;//忘写了
}

template<class type>
singlelinknode<type>::~singlelinknode()
{
    clear();
    delete head;

}

template<class type>
void singlelinknode<type>::clear()
{
    node*tmp = head->next;
    head->next = tail;

    while (tmp != tail)//跟课本上不太一样
    {
        node*p = tmp;
        tmp = tmp->next;/*check*/
        delete p;
    }
    currentlength = 0;//注意清零,忘写了
}

template<class type>
int singlelinknode<type>::length() const
{
    return currentlength;
}

template<class type>//插到i前面还是i后面? 是i和i-1
void singlelinknode<type>::insert(int i, const type & x)
{
    node*p = move(i-1);
    node*tmp = new node(x, p->next);
    p->next = tmp;

    currentlength++;//注意清零,忘写了
}

template<class type>
void singlelinknode<type>::remove(int i)
{
    char*tmp = move(i-1);/*diffenence from doubly-linked is
                         we can only start from the very beginning*/
    char*p = tmp->next;
    tmp->next = tmp->next->next;/*check*/

    delete p;//曾经在这一块有过疑问,
    //事实上删除指针会自动启用对应的析构函数

    currentlength--;
}

template<class type>
int singlelinknode<type>::search(const type & x) const
{
    node*tmp = head;
    int i = 0;

    while (tmp != tail && tmp->data != x)
    {
        tmp = tmp->next;
        i++;
    }

    if (tmp == tail)
    {
        cout << "none exit\t\n";
        return -1;
    }
    else return i;//same question,should i start from 0?

    return 0;
}

template<class type>
type singlelinknode<type>::visit(int i) const
{
    if (i<0 || i>currentlength)throw OutOfBound();//at first,this hacebeen ignorant

    node*tmp = head;
    int n = 0;
    while (n < i)
    {
        tmp = tmp->next;
        n++;
    }

    return tmp->data;//我也不知道应该是前一个还是后一个
}

template<class type>
void singlelinknode<type>::traverse() const
{
    node*tmp = head - next;
    while (node != tail)
    {
        cout << tmp->data << endl;
        tmp = tmp->next;
    }

}

帮我改一下这段代码#include <stdio.h> #define N 4 #define OK 1 typedef struct { int no; char name[20]; int DataStructure; int C; int SUM; }student; typedef structure{ student STU[N]; int length; }STUDENT; int input(STUDENT *stu) { for(int i = 0 ; i < N ; i++) { system("cls"); printf("请输入学生信息:\n"); printf("请输入第%d个学生的学号:",n+1); scanf("%d",&(stu -> STU[i].no)); printf("请输入第%d个学生的姓名:",n+1); scanf("%c",&(stu->STU[i].name)); printf("请输入第%d个学生的DataStructure成绩",i+1); scanf("%d",&(stu->STU[i].DataStructure)); printf("请输入第%d个学生的C语言成绩",i+1); scanf("%d",&(stu->STU[i].C)); stu->STU[i].SUM = stu->STU[i].DataStructure + stu->STU[i].C; } return OK; } void main(){ int n; int i; STUDENT stu ; stu = (STUDENT *)malloc(sizeof(STUDENT)); while(n!=7){ system("cls"); printf("学生成绩管理系统:\n"); printf("****(1):信息输入(INPUT)***************************\n"); printf("****(2):总分统计(COUNT)***************************\n"); printf("****(3):按DataStructure项排序(SortDataStructure)**\n"); printf("****(4):按C项排序(SortC)**************************\n"); printf("****(5):按SUM项排序(SortSUM)**********************\n"); printf("****(6):输入C成绩,查找该成绩位置*******************\n"); printf("****(7):退出****************************************\n"); printf("****请选择输入(1-7): *************************\n"); scanf("%d",&n); switch(n){ case 1: i = input(&stu); if(i==1){ printf("成绩输入成功"); };break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; case 7: break; default : printf("输入不正确,请重新输入:\n"); scanf("%d",&n); break; } } }
05-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值