数据结构链表的初始化写入值
#include
#include
using std::cin;
using std::cout;
using std::endl;
#include
#include
#define OK 1
#define FALSE 0
typedef int status;
typedef int elemtype;
typedef struct LNode {
elemtype data;
struct LNode* next;
}LNode, * LinkList;
status init_LinkList1();
status output_LinkList(LinkList L);
status init_LinkList1(LinkList L)
{
int n;
printf("请输入将要建立的链表的长度:");
cin >> n;
cout << endl;
printf("请输入值:");
LNode* newbase = (LNode*)malloc(sizeof(LNode));
if (newbase) {
L = newbase;
L->next = 0;
// printf("建立头节点成功\n");
}
else return 0;//建立头节点
LNode* r = L; //尾指针
LNode* p;
for (int i = 1; i <= n; ++i)
{
LinkList newbase = new LNode;
if (newbase)
{
p = newbase;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
// printf("赋值成功\n");
}
}
printf("赋值成功\n");
return OK;
}
status output_LinkList(LinkList L) {
LNode* p = L->next;
printf("\n链表中的数据为:");
while (p) {
printf("%d ", p->data);
p = p->next;
}
// p=p->next;
return OK;
}
int main()
{
LinkList L=0;
init_LinkList1(L);
output_LinkList(L);
}
不能执行输出函,并且非正常退出
用C++的语法,在初始化函数的形参列表里加上引用。
解释一下为什么要加上引用才行。我的想法是:不加引用,函数是地址传递,同样可以做到改变L,但实际上会非正常退出。
因为main函数中,只是定义了一个L,是个空指针,函数内要实现外部指针地址的修改,就必须用指针的指针类型,或者指针的引用类型。因为指针的引用类型写法比较简单,所以能用引用的情况下,用指针的引用更加常用。如果不支持引用类型,就需要用指针的指针类型。
改动处见注释,供参考:
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
#include <cstdlib> //修改
//#include <malloc.h>//修改
#define OK 1
#define FALSE 0
typedef int status;
typedef int elemtype;
typedef struct LNode {
elemtype data;
struct LNode* next;
}LNode, * LinkList;
status init_LinkList1(LinkList* L); //修改
status output_LinkList(LinkList L);
status init_LinkList1(LinkList* L) //修改
{
int n;
printf("请输入将要建立的链表的长度:");
cin >> n;
cout << endl;
printf("请输入值:");
LNode* newbase = new LNode;
//LNode* newbase = (LNode*)malloc(sizeof(LNode)); //修改
if (newbase) {
(*L) = newbase; //修改
(*L)->next = 0; //修改
// printf("建立头节点成功\n");
}
else return 0;//建立头节点
LNode* r = (*L); //尾指针 //修改
LNode* p;
for (int i = 1; i <= n; ++i)
{
LinkList newbase = new LNode;
if (newbase)
{
p = newbase;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
//printf("赋值成功\n");
}
}
printf("赋值成功\n");
return OK;
}
status output_LinkList(LinkList L) {
LNode* p = L->next;
printf("\n链表中的数据为:");
while (p) {
printf("%d ", p->data);
p = p->next;
}
// p=p->next;
return OK;
}
int main()
{
LinkList L = 0;
init_LinkList1(&L); //修改
output_LinkList(L);
return 0;
}