小白成长日记(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();
}
相关文章推荐
- 数据结构学习笔记7--c语言建立一个链表(已测正确无误)
- C语言单向链表的建立
- C语言链表的建立、插入和删除
- PAT 2-12 两个有序链表序列的交集(C语言实现)
- c语言-单链表的建立
- C语言单向链表的建立
- 【C语言】建立静态链 并 输出链表
- c语言:写一个函数建立一个有3名学生数据的单向动态链表
- C语言单向链表的建立
- C语言:建立动态链表
- 【C语言】 链表 单链的建立以及输出
- 【碎片知识(2)· C语言】链表的建立、输出、特定点的删除和插入以及malloc函数的应用
- C语言:动态链表的建立,查找,删除,插入功能的实现
- 一起学习C语言之建立链表
- 利用C语言的链表建立一个通讯录
- C语言——链表部分(包括节点的建立、总长度、显示链表、插入节点以及删除节点)
- 小白成长日记(14)--(C语言)关于解决头插法单链表中问题二
- C语言单向链表的建立
- c语言链表的建立
- C语言单向链表的建立