编辑代码

/*---------算法3.5  (第80页)带头结点的头插法建立单链表-------
带头结点的头插法,返回单链表的头指针
---------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>

/*---------单链表结点类型定义(第79页)-------------*/
typedef char datatype;

typedef struct node {
	datatype data;
	struct node *next;
} linklist;

linklist *CreateListF(); //带头结点的头插法
void PrintList(linklist *head);

int main() {

	printf("输入字母(中间不用空格),以Enter键结束\n");
	linklist *L_F = CreateListF();
	printf("采用带头结点的头插法建立单链表:\n");
	PrintList(L_F);

	return 0;
}

/*---------算法3.5  (第80页)---------------------------
带头结点的头插法,返回单链表的头指针
---------------------------------------------------------*/
linklist *CreateListF() {
	linklist *head;   //head 为头指针
	linklist *p;     //p为工作指针
	char ch;
	head = (linklist *)malloc(sizeof(linklist));  //产生头结点
	head->next = NULL;
	while ((ch = getchar()) != '\n') {   //输入abc
		p = (linklist *)malloc(sizeof(linklist));  //生成新结点
		p->data = ch;  //对结点的数据域赋值
		p->next = head->next;  //新结点的指针域指向原第一个节点
		head->next = p;   //修改头结点的指针域
	}
	return head;
}

void PrintList(linklist *head) {
	linklist *p = head;
	p = p->next;
	while (1) {
		if (p == NULL) {
			printf("\n");
			return;
		}
		printf("%5c", p->data);
		p = p->next;
	}
}