c++ 的单链表的问题

0

c++的单链表中,循环输入指定数目的值。在其输出的过程中,输入函数和输出函数的关联问题,以及关于通过循环条件输入值并赋给相应的节点的过程中出现的问题

// 所引用的头文件和适用于c++的编程环境所需要的格式,以及一些普通的用于判断的参数
#include<iostream>
#include<fstream>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2


// 单链表的结构为:
typedef struct lnode
{
	int data;
	struct lnode *next;
}lnode, *linklist;


// 单链表的初始化
void initlist(linklist &l)
{
	l=new lnode;
	if(!l)
		exit(0);
	l->next=NULL;
	cout<<"initial success\n";
}


// 输入函数
void inputlist(linklist &l)
{
	linklist p,q;
	int k,j=1;
	q=new lnode;
	q=l->next;
	cin>>k;
	q->data=k;
	for(;j<=4;j++)
	{
		q=new lnode;
		q=q->next;
		q->next=NULL;
		cin>>k;
		q->data=k;
	}
	if(j==5)
		cout<<"success";
}
// 疑惑:在这里,不是很理解单链表建立节点与输入值去替换节点的数据域的这一过程的顺序,
// 也不明白 new lnode 是在什么情况下使用的(lnode为单链表的结构体类型),
// 如果要一次性通过cin语句一次性输入多个值(个数为定值)(例如:1 3 4 7 10)的话,
// 上面的输入函数不能够实现这一功能。希望有大佬能够解决我的疑惑。


// 输出函数
void outputlist(linklist &l)
{
	l=l->next;
	while(l)
	{
		cout<<l->data<<"\n";
		l=l->next;
	}
	if(!l)
		cout<<"output success\n";
}
// 疑惑:与输入函数相同的问题,无法正确输出之前在输入函数里输入的各个值,
// 也就是输入函数没有正确的将输入的值赋给链表l的新建立的各个节点的数据域里,
// 或是输出函数本身的设置就存在问题。或是链表l根本就没有参与输入和输出的运算。。。


// 主函数
int main()
{
	linklist l;
	int k=0,i,q=1;
	initlist(l);
	inputlist(l);
	outputlist(l);
	return 1;
}

希望有人能解答这样的问题啊=。=

ava
Giotto·Vongola

2020-8-28

1

我来试着解答一下吧,不论是bug还是码风,从上到下,我看到的一律说出来,如果又错误的还请勿喷

1.

struct lnode *next;

如果是c++可以省略前面的struct,我一个纯c++党看到这个的时候还疑惑了半天(捂脸

2、对于链表的插入问题

你的代码确实很清奇

for(;j<=4;j++)
	{
		q=new lnode;
		q=q->next;
		q->next=NULL;
		cin>>k;
		q->data=k;
	}

q=new lnode;之后,q->next未被赋值,直接q=q->next应该是未定义操作(貌似?)

所以我认为你对链表的理解还存在很大的偏差

我来解释一下真正的链表操作

首先链表的数据结构和你写的差不多:

struct node{
	int data;
	node* next;
}*head,*tail;

但是加入了head和tail两个指针,分别指向链表头和链表尾,他们一开始应为nullptr

插入操作:

void push_front(int k){
	node* nd=new node;
	nd->data=k;
	nd->next=head;
	head=nd;
	if(!tail)tail=head;
}

将一个数插入到链表头,执行顺序如下:

1、创建一个新的指针

2、将新指针的data赋值为k

3、将新指针指向head

4、将head变为新指针

5、如果tail为空,就将它指向head

void push_back(int k){
	node* nd=new node;
	nd->data=k;
	nd->next=nullptr;
	tail->next=nd;
	tail=nd;
	if(!head)head=tail;
}

将一个数插到链表尾,顺序如下:

1、创建一个新node指针并赋值data,next设为nullptr

2、将链表尾指向新指针

3、将新指针设为链表尾

4、如果链表头为nullptr,就将它设为tail


继续看你的代码

// 输出函数
void outputlist(linklist &l)
{
	l=l->next;
	while(l)
	{
		cout<<l->data<<"\n";
		l=l->next;
	}
	if(!l)
		cout<<"output success\n";
}

一开始就l=l->next;又是什么操作?那么原来的linklist呢?不用输出了?

我还是再写一个输出函数给你吧。。

void print_lnk(node* nd){
	while(nd){
		cout<<nd->data<<" ";
		nd=nd->next;
	}
}

以上,如果还有问题我会补充,还是建议楼主再去补补链表以及指针

ava
无名氏

2020-8-28

技术讨论社区