您的位置:首页 > 编程语言 > C语言/C++

小白成长日记(12)--(C语言)头插法建立单链表(输入输出)

2017-11-18 00:29 615 查看

今天和鹏学长研究了很长时间头插法单链表,总的来说思路还是明确的,主要是对代码的编写能力还是有待提高,先贴上第一个问题的起初代码:

#include <stdio.h>
#include <stdlib.h>

typedef int DataType;
typedef struct node {
DataType data;
struct node *next;
}LinkNode;

typedef LinkNode* LinkList;

void insertFront(LinkList, DataType);
void insert(LinkList);
void output(LinkList);

void insert(LinkList L) {
L = (LinkList)malloc(sizeof(LinkNode));
L->next = 0;

}

void insertFront(LinkList L, DataType n) {

LinkList p;
int i;
int d;
for (i = n; i > 0; i--) {
printf("输入第%d个数据元素:", i);
scanf_s("%d", &d);
p = (LinkList)malloc(sizeof(LinkNode));
p->data = d;
p->next = L->next;
L->next = p;
}
}
void output(LinkList L) {
LinkList p = L;
while (p != NULL) {
printf("%d\n", p->data);
p = p->next;
}
}
void main() {
LinkList L;
insert(L);
int n;
printf("请输入元素个数:");
scanf_s("%d", &n);
insertFront(L, n);
printf("您输入的链表是:\n");
output(L);

getchar();
getchar();
}


问题一、

遇到的第一个问题就是main函数中的L未初始化,当然这个问题很好解决(虽然很白,但也不傻)

修改:main函数中的代码如下:

void main() {
LinkList L = 0;
insert(L);
int n;
printf("请输入元素个数:");
scanf_s("%d", &n);
insertFront(L, n);
printf("您输入的链表是:\n");
output(L);

getchar();
getchar();
}


问题二、

虽然解决代码书写错误,但是在运行代码时发现输入第二个数的时候程序崩溃,在走断点时发现,main中的L没有能够接收到insert函数中的L返回值。在尝试无果后只能用最笨的方法先解决这个问题,将insert函数删除,将链表初始化全部写入main函数里。

修改:main函数代码如下:

void main() {
LinkList L = 0;
L = (LinkList)malloc(sizeof(LinkNode));
L->next = 0;
int n;
printf("请输入元素个数:");
scanf_s("%d", &n);
insertFront(L, n);
printf("您输入的链表是:\n");
output(L);

getchar();
getchar();
}


问题三、

当然“成功”给大家展示一下我的运行结果:



哈哈哈哈哈哈。。。。。额!怎么怪怪的。。。。竟然有一个乱码!!!!

很是难受,可是又有什么办法,只能选择原谅自己,继续找八哥!

欧凯,继续走断点,果然,找到了这个这个乱码的爸爸:L->data,是的,就是这货,但是为什么他会横空插了一脚,推测应该是输出函数的问题,果断走了一波output,原来,当输出链表值时,p-data会首先输出它的儿子(初始值),接着再输出链表内的值,好吧,那我就着手灭掉你吧。

修改:output函数代码如下:

void output(LinkList L) {
LinkList p = L;
while (p != NULL) {
p = p->next;
if (p != NULL) {
printf("%d\n", p->data);
}

}
}


让我们来运行一下结果:



虽然程序正常运行了,但是问题二没有彻底解决,SO,希望各位大神能够帮我彻底解决问题。附上修改后的源代码:

#include <stdio.h>
#include <stdlib.h>

typedef int DataType;
typedef struct node {
DataType data;
struct node *next;
}LinkNode;

typedef LinkNode* LinkList;

void insertFront(LinkList, DataType);
//void insert(LinkList);
void output(LinkList);

void insertFront(LinkList L, DataType n) {

LinkList p;
int i;
int d;
for (i = n; i > 0; i--) {
printf("输入第%d个数据元素:", i);
scanf_s("%d", &d);
p = (LinkList)malloc(sizeof(LinkNode));
p->data = d;
p->next = L->next;
L->next = p;
}
}
void output(LinkList L) { LinkList p = L; while (p != NULL) { p = p->next; if (p != NULL) { printf("%d\n", p->data); } } }
void main() {
LinkList L = NULL;
L = (LinkList)malloc(sizeof(LinkNode));
L->next = 0;

int n;
printf("请输入元素个数:");
scanf_s("%d", &n);
insertFront(L, n);
printf("您输入的链表是:\n");

output(L);

getchar();
getchar();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: