#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为例,运行得到的结果是:
哪位大神帮忙看一下问题到底出在哪?小弟愚钝,检查了好久,实在检查不出来~