#include
#include
struct link *AppendNode(struct link *head);
void DisplyNode(struct link *head);
void DeleteMemory(struct link *head);
struct link
{
int data;
struct link *next;
};
int main()
{
int i = 0;
char c;
struct link *head = NULL; //链表头指针
printf("Do you want to append a new node(Y/N)?");
scanf(" %c", &c);
while (c == 'Y' || c == 'y')
{
head = AppendNode(head); //向head为头指针的链表末尾添加节点
DisplyNode(head); //显示当前链表中的各节点信息
printf("Do you want to append a new node(Y/N)?");
scanf(" %c", &c);
i++;
}
printf("%d new node have been apended!\n", i);
DeleteMemory(head); //释放所有动态分配的内存
}
//新建一个节点并添加到链表末尾,并返回添加节点后的链表的头指针
struct link *AppendNode(struct link *head)
{
struct link *p = NULL, *pr = head;
int data;
p = (struct link *)malloc(sizeof(struct link));//让p指向新节点
if (p == NULL) //申请内存失败则退出程序
{
printf("No enough memory ro allocate!\n");
exit(0);
}
if (head == NULL) //若原链表为空表
head = p;
else //若原链表非空,则将新建节点添加至表尾
{
while (pr->next != NULL) //若未到表尾,则移动pr直到pr指向表尾
pr = pr->next; //让pr指向下一个节点
pr->next = p; //让末节点的指针域指向新建节点
}
printf("Input node data:");
scanf("%d", &data);
p->data = data;
p->next = NULL;
return head;
}
//显示链表中所有节点的节点号和该节点的数据项内容
void DisplyNode(struct link *head)
{
struct link *p = head;
int j = 1;
while (p != NULL)
{
printf("%5d%10d\n", j, p->data);
p = p->next;
j++;
}
}
//释放head指向的链表中所有的节点占用的内容
void DeleteMemory(struct link *head)
{
struct link *p = head, *pr = NULL;
while (p != NULL)
{
pr = p;
p = p->next;
free(pr);
}
}