#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为例,运行得到的结果是:

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


  • vicky    2020-04-16 16:13:39
  • 阅读 1434    收藏 0    回答 1
  • 邀请
  • 收藏
  • 分享
发送
登录 后发表评论
  • 51testing软件测试圈微信