weixin_43519173
赵小帅go
采纳率30%
2020-04-15 18:07

C++单链表的赋值:代码bug查找

5
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <windows.h>

#define ok 1
#define cout_width 12
#define cout_decimal_digits 6

//命名空间
using namespace std;

//非零元值的数据类型
typedef double elem_type;

//====================单链表存向量==========================
typedef struct node
{
    int k;  //向量某一个非零元素的指标
    elem_type data;   //向量某一个非零元素的值
    node *next;   
}Node;  
typedef Node *SingleList;

//单链表的整表创建(从文件):尾插法
void CreateSingleList_File(SingleList &L, string vector)
{
    SingleList p, r;

    int n; 
    cout << "输入向量非零元素的个数:";
    cin >> n;

    //r:末节点的头指针
    r = L = new Node;;

    //打开文件
    ifstream fin_u(vector, ios::in);

    for (int i = 0; i < n; i++)
    {
        //创建新节点
        p = new Node;

        //接收指标和值 
        fin_u>>p->k>>p->data;

        //将末节点和新节点连接起来,末节点在前,新节点在后
        r->next = p;

        //使r成为末节点的头指针
        r = p;
    }
    //末节点的next值等于NULL:链表的结束标志
    r->next = NULL;

    //关闭文件 
    fin_u.close();
}

//向带有头节点的单链表L的末尾插入节点
//节点指标为k,节点的值为data 
void SingleList_InsertNode_Tail(SingleList &L,int k,int data)
{
    //新建末节点并赋值 
    SingleList p=new Node;
    p->k=k;
    p->data=data;
    p->next=NULL; 

    //定位到末节点:q指向末节点 
    SingleList q=L;
    while(q->next)
        q=q->next;

    //将新的末节点链接到原来的末节点上 
    q->next=p;
}

//将(k,data)这个数据添加到单链表中 
void SingleList_Assign(SingleList &L,int k,elem_type data)
{
    SingleList p=L->next,q;

    //定位:
    //如果L(k)不为零,返回一个指向L(k)的指针 
    //如果L(k)为零,返回一个指向L(k)后面的非零元的指针 
    //如果只有头节点,返回头指针
    if(p)
        while(p&&p->k<k)
            p=p->next;

    //如果单链表中有指标为k的数据,将data值换掉即可 
    if(p&&p->k==k)
        p->data=data;

    //如果单链表中没有指标为k的数据,则新建节点并链接
    //链接时需要判断:定位之后的指针p是否等于NULL 
    else
    {       
        //如果定位之后p等于NULL
        //表明新节点q应该是末节点 
        if(p==NULL) 
            //将(k,data)插入到单链表L的末尾 
            SingleList_InsertNode_Tail(L,k,data); 
        //否则将新节点q插入到单链表中 
        else
        {           
            //新建节点并赋值
            q=new Node;
            q->k=k;
            q->data=data;

            //和后面一个节点链接上 
            q->next=p; 
            //和前面一个节点链接上 
            p=q;
        }        
    } 
}

//输出单链表的非零元
void SingleListDisplay_NotZero(SingleList &L)
{
    //跳过头节点 
    SingleList p = L->next;

    //输出格式控制
    cout << setiosflags(ios::fixed) << setiosflags(ios::right) << setprecision(cout_decimal_digits);

    while (p)
    {       
        cout << setw(cout_width) << p->k << setw(cout_width) << p->data << endl;
        p = p->next;
    }
}

int main()
{   
    SingleList u;
    string vector_u = "u.txt";
    CreateSingleList_File(u,vector_u);

    //输出u 
    cout<<"向量u:"<<endl;
    SingleListDisplay_NotZero(u);

    int k=1;
    SingleList_Assign(u,k,-1);

    //输出赋值之后的向量u 
    cout<<"赋值之后的向量u:"<<endl;
    SingleListDisplay_NotZero(u);

    system("pause");
    return ok;
}

u.txt文件中的值:
2 1
4 3
7 2
12 6

代码的主要目的:给单链表表示的向量u的某一个元素赋值,以给第1个元素赋值为-1为例,运行得到的结果是:
图片说明

哪位大神帮忙看一下问题到底出在哪?小弟愚钝,检查了好久,实在检查不出来~

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • Mimido_luoluo 檬檬陪我吹柠柠的风 1年前

    你定位的地方,设p->k<k 这一个条件,想改变第一个元素,应该是k=2吧

    点赞 评论 复制链接分享
  • dashicaineng 蔡能教授,网站特聘专家 1年前