//创建字符长链表并将其输出
#include<stdio.h>
#include<stdlib.h>
struct string
{
char ch;
struct string *nextPtr;
};
struct string *creat (struct string *h);
void print_string (struct string *h);
int num = 0;
int main (void)
{
struct string *head; //定义表头指针
head = NULL; //创建一个空表
printf("Please enter some characters:\n");
head = creat(head); //调用函数创建链表
print_string(head); //调用函数输出链表内容
printf("\nnumber of your enter is :%d\n",num);
}
struct string *creat (struct string *h)
{
struct string *p1,*p2;
p1 = p2 = (struct string*)malloc(sizeof(struct string)); //申请新结点
if (p2 != NULL){
scanf("%c",&p2->ch); //输入结点的值
p2->nextPtr = NULL; //新结点指针成员的值赋为空
}
while (p2->ch != '\n')
{
num++; //字符个数加1
if (h == NULL)
h = p2; //若为空表,接入表头
else
p1->nextPtr = p2; //若为非空表,接入表尾
p1 = p2;
p2 = (struct string*)malloc(sizeof(struct string)); //申请下一个新结点
if (p2 != NULL){
scanf("%c",&p2->ch); //输入结点的值
p2->nextPtr = NULL;
}
}
return h;
}
void print_string(struct string *h)
{
struct string *temp;
temp = h; //获取链表的头指针
while (temp != NULL){
printf("%-2c",temp->ch); //输出链表结点的值
temp = temp->nextPtr; //移到笑一个结点
}
}
(由于原来的输入提示有乱码我把输入提示换成英文了)
不得不说书上的实例就算很老了也不是我这个半吊子能比的,虽然只有50多行但编译出来一个警告都没有。
虽然对这代码的结构还是云里雾里的,但基本思路在抄过一遍后还是理解了。
首先创建一个标准的链表结构体(抄完这代码以后我觉得结构体这东西是不是90%都用在链表上面),其中一个元素为待输入的字符,另一个为指向下一个结构体的指针,由于结构体的特性(变量私有性),在多个结构体中创建相同名称的指针变量p2并不会造成冲突,这点很重要。然后先使用一个外部的指针将输入的字符赋给结构体内部的字符变量,再将外部指针指向下一个结构体的字符变量位置,先检测要赋的值是否为空(NULL),然后将该字符变量的地址赋给上一个结构体的指针,这样就使两个结构体通过一个指针单方面串联起来。结果就是,“结构体名称->字指针名称”始终指向下一个结构体,从而组成了链表。由此,打印该链表中的内容应该是一个很简单的算法。
但我还是有很多不懂的细节:
1、那么多结构体要串联在一起要怎么命名?通过1234肯定不可能,那样链表就失去意义了。但除此之外难道是通过数组吗?结构体可以创建数组吗?从理论上来说应该可以,因为结构体本质上还是高级数据类型,没有理由不可以定义一个数据类型的数组,但到底是怎么搬到的我还是不能理解,目测要把整个代码全部翻译一遍才能懂。
2、struct string *creat(struct string *h)这一句我表示理解不能.......不知道到底是定义了一个函数还是创建了一个结构体的元素。从下面来看应该是定义函数,那那么多结构体是从哪里来的?我晕......还是要翻译代码......(我不想翻学校的课本啊........不知道什么是错的什么是对的)。
总之,虽然这个代码大体的实现方法有了初步认识,但具体的写法还是莫宰羊.........究其原因应该还是在上结构体的时候赶了进度,导致我还没听懂结构体的具体用法就过去了,然后我又没上心,然后.....就没有然后了.....
这是个悲伤的故事...........
要学懂链表,首先要弄明白结构体的具体用法,毕竟链表不是C的基础用法,而是C的一种使用技巧,这个技巧是建立在链表和指针之上的(好在Primer Plus指针的内容快弄完了,这方面没有太大的困难了),所以以基础上高阶是必要的。
回头弄结构体吧........