向链表添加节点数据
/**************
向链表添加节点数据
*************/
#include <stdio.h>
#include <stdlib.h>
struct link
{
int data;
struct link *next;
};
//新建一个节点并添加到链表末尾,返回添加节点后的链表头指针
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 to 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); //打印第j个节点的数据
p = p->next; //让p指向下一个节点
j++;
}
}
void DeleteMemory(struct link *head) //释放head指向的链表中所有节点占用的内存
{
struct link *p = head,*p = NULL;
while(p != NULL) //若不是表尾,则释放节点所占用的内存
{
pr = p; //在pr中保存当前节点的指针
p = p->next; //让p指向下一个节点
free(pr); //释放pr指向的当前节点占用的内存
}
}
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);
/*对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,
scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()
则读取标准输入流中第一个非空白字符。
*/
while(c =='y'||c == 'N')
{
head = AppendNode(head); //向head为头指针的链表末尾添加节点
DisplyNode(head); //显示当前链表中各节点信息
printf("Do you want to append a new node(Y/N)?");
scanf(" %c",&c);
i++;
}
printf(" %d new nodes have been append!\n",i);
DeleteMemory(head); //释放所有动态分配的内存
return 0;
向链表添加节点数据
*************/
#include <stdio.h>
#include <stdlib.h>
struct link
{
int data;
struct link *next;
};
//新建一个节点并添加到链表末尾,返回添加节点后的链表头指针
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 to 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); //打印第j个节点的数据
p = p->next; //让p指向下一个节点
j++;
}
}
void DeleteMemory(struct link *head) //释放head指向的链表中所有节点占用的内存
{
struct link *p = head,*p = NULL;
while(p != NULL) //若不是表尾,则释放节点所占用的内存
{
pr = p; //在pr中保存当前节点的指针
p = p->next; //让p指向下一个节点
free(pr); //释放pr指向的当前节点占用的内存
}
}
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);
/*对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,
scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()
则读取标准输入流中第一个非空白字符。
*/
while(c =='y'||c == 'N')
{
head = AppendNode(head); //向head为头指针的链表末尾添加节点
DisplyNode(head); //显示当前链表中各节点信息
printf("Do you want to append a new node(Y/N)?");
scanf(" %c",&c);
i++;
}
printf(" %d new nodes have been append!\n",i);
DeleteMemory(head); //释放所有动态分配的内存
return 0;
}