向链表添加节点数据

来源:互联网 发布:淘宝旺旺名怎么设置 编辑:程序博客网 时间:2024/06/02 03:51
/**************
向链表添加节点数据
*************/

#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;

}



原创粉丝点击