标题:大侠帮忙找找哪儿错了 链表 (数据输入没错,但输出的都是最后输入的那个 ...
只看楼主
罗马龙骑士
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2012-9-14
结帖率:100%
 问题点数:0 回复次数:1 
大侠帮忙找找哪儿错了 链表 (数据输入没错,但输出的都是最后输入的那个数据)
#include<iostream>
using namespace std;
#define ERROR 0;
#define OK    1;
 struct Student
 {
     int ID;
     int length;
     Student *next;
 };

Student *InitList()
{
    Student *p;
    p=new Student;
    if(!p) return ERROR;   //判错行,如果没成功生成节点则返回EREEOE。
    p->length=0;      //初始化头结点信息,注重length和next,其他信息弱化,掷空。
    p->ID=NULL;
    p->next=NULL;
    return p;
}

void AddList(Student *head)
{
    int i;      //循环控制变量。
    Student *p,*q;
    q=head;
    for(i=1;i<=5;i++)   //默认生成节点为1,2,3,4,5。   头结点为0节点。
    {
        p=new Student;
        if(!p) cout<<"未成功生成节点"<<endl;
        p->next=NULL;//初始化各节点,弱化length,注重next,其他信息先掷空,等待UpdateList函数更新这些信息。
        p->ID=NULL;
        q->next=p;
        q=p;    //偏移指针。
    }
    head->length+=5;
}

Student *Visit(Student *head,int n)  //返回第n个节点的地址,计数不包括头结点。
{
    if(n<0||n>head->length) cout<<"输入了错误的学生序号"; //验证接收数据的正确性。
    int i;  //循环控制变量。
    Student *p,*q;
    q=head;
    if(n=0) return head;   //若为第0节点,则返回头节点指针。
    for(i=1;i<=n+1;i++)    //i为当前指针所指向的第i个节点。   n为返回指针所指向的节点。
    {
        p=q->next;
        q=p;  //偏移指针。
    }
    return p;
}

void PrintList(Student *head)   //这里是逐个输出整个链表!
{
    Student *p,*r;
    int i,a;  //循环控制变量。
    p=head->next;
    if(p!=NULL)   //保护性代码行,如果为空表,则不执行输出信息。
    {
        for(i=1;i<=head->length;i++)
        {
            r=Visit(head,i);
            a=r->ID;
            cout<<"第"<<i<<"学生ID为:"<<a<<endl;//我们输出的是信息,并不关注链表的长度,所以不再输出length。
        }
    }
    else cout<<"此表为空表,无法再输出信息"<<endl;
}

void UpdateList(Student *head)
{
    int i;  //循环控制变量。
    Student *p;
    int a;
    for(i=1;i<=head->length;i++)   //逐个更新元素数据循环。
    {
        p=Visit(head,i);
        cout<<"第"<<i<<"位学生的ID"<<endl;
        cin>>a;
        p->ID=a;
    }
}

void InsirtList(Student *head,int x)
{
    Student *p,*r;
    r=Visit(head,x);
    p=new Student;
    if(!p) cout<<"插入节点生成失败"<<endl;
    p->next=r->next;
    r->next=p;
    cout<<"新学生的ID为:";
    cin>>p->ID;
    p->length=NULL;   //弱化数据节点的length,掷空即可。
    ++head->length;
}

void GetElem(Student *head,int y)
{
    Student *p;
    p=Visit(head,y);
    cout<<"第"<<y<<"位学生的ID为:"<<p->ID<<endl;
}

void FrontElem(Student *head,int u)
{
    if(u<=1) cout<<"小于等于1的节点前驱不合法。"<<endl;
    Student*p;
    p=Visit(head,u-1);
    cout<<"第"<<u<<"个节点的前驱是:"<<u-1<<"信息如下"<<endl;
    cout<<p->ID<<endl;

}

void BehindElem(Student *head,int v)
{
    if(v>=head->length) cout<<"大于等于末尾节点的后继不合法。"<<endl;
    Student*p;
    p=Visit(head,v+1);
    cout<<"第"<<v<<"个节点的后继是:"<<v+1<<"信息如下"<<endl;
    cout<<p->ID<<endl;
}

void DeleElem(Student *head,int z)
{
    if(z<0||z>head->length)  cout<<"错误的位置"<<endl;   //保护性代码行。你懂得。
    Student *p,*q;
    p=Visit(head,z-1);   //得到所删除元素的前一个节点。这样就不可能得到最后一个节点。
    q=p->next;  //将q指向所删除节点。
    if(q->next!=NULL)    //如果为最后一个节点则不再连接。
    {
        p->next=q->next;//连接所删除节点后的其他节点。
    }
    delete q; //删除这个节点。
    --head->length;  //链表长度减一。
}

void FreeList(Student *head)
{
    Student *p;
    int i;  //循环控制变量。
    for(i=head->length;i<=1;--i)   //从最后逐个删除节点。
    {
        p=Visit(head,i);
        delete p;
    }
    head->length=0;  //只要执行完这个函数,链表长度必定为空。
}

int main()
{
    cout<<"创造头节点... ..."<<endl;
    Student *head;
    head=InitList();
    cout<<"完成创造!"<<endl;

    cout<<"以下是增加节点,我们默认生成5个节点"<<endl;
    AddList(head);
    cout<<"完成增加!"<<endl;

    cout<<"以下是更新5个节点信息:"<<endl;
    UpdateList(head);
    cout<<"更新后链表信息为:"<<endl;
    PrintList(head);

    cout<<"以下为插入节点操作:"<<endl;
    int x;
    cout<<"请输入希望插入在第几个节点后:"<<endl;
    cin>>x;
    InsirtList(head,x);
    cout<<"插入后链表信息为:"<<endl;
    PrintList(head);

    cout<<"以下是得到节点信息:"<<endl;
    int y;
    cout<<"现在链表共有节点:"<<head->length<<"个。"<<endl;
    cout<<"请输入希望得到第几个节点:"<<endl;
    cin>>y;
    if(y!=0)
        GetElem(head,y);
    else
        cout<<"输入了错误节点"<<endl;

    cout<<"以下为得到节点前驱:"<<endl;
    int u;
    cout<<"希望得到第几个节点的前驱:"<<endl;
    cin>>u;
    FrontElem(head,u);

    cout<<"以下为得到节点后继:"<<endl;
    int v;
    cout<<"希望得到第几个节点的后继:"<<endl;
    cin>>v;
    BehindElem(head,v);

    cout<<"以下为删除节点操作:"<<endl;
    int z;
    cout<<"请输入希望删除节点位置"<<endl;
    cin>>z;
    DeleElem(head,z);
    cout<<"删除后链表信息为:"<<endl;
    PrintList(head);

    cout<<"以下为掷空这个链表操作:"<<endl;
    FreeList(head);
    cout<<"掷空后链表为:"<<endl;
    PrintList(head);

    return OK;
}
搜索更多相关主题的帖子: return include next 
2012-10-26 20:28
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
程序代码:
Student *Visit(Student *head,int n)  //返回第n个节点的地址,计数不包括头结点。
{
    if(n<0||n>head->length) cout<<"输入了错误的学生序号"; //验证接收数据的正确性。
    int i;  //循环控制变量。
    Student *p,*q;
    q=head;
    if(n==0) return head;   //若为第0节点,则返回头节点指针。
    for(i=1;i<n+1;i++)    //i为当前指针所指向的第i个节点。   n为返回指针所指向的节点。
    {
        p=q->next;
        q=p;  //偏移指针。
    }
    return p;
}
2012-10-26 23:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-384577-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.218875 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved