链表

来源:互联网 发布:全国房地产数据 编辑:程序博客网 时间:2024/06/14 20:36
#include <stdio.h>#include <stdlib.h>#include <malloc.h>typedef struct Link{    int data;//定义节点的数据    struct Link *next;//定义指向下一个结点的指针}L;//定义一个别名为 L 的链表//表尾插入节点建立链表L *AppendNode(L *head){    int d;    L *p1=NULL, *p2=head;//定义两个空指针    p1 = (L *)malloc(sizeof(L));//为了新建节点申请分配内存空间    if(p1==NULL)    {        printf("ERROR!\n");        exit(0);    }//如果内存申请分配失败,则提示错误后退出程序    else if(head==NULL)    {        head = p1;    }//如果内存申请分配成功并且链表为空表,则置新建节点为头结点    else    {        while(p2->next != NULL)        {            p2 = p2->next;        }//如果指针未到表尾,则直接移动指针直到指针 p2 指向表尾        p2->next = p1;    }//如果原链表非空,则将新建节点添加到表尾    p2 = p1;    printf("please input data:");    scanf("%d", &d);    p2->data = d;    p2->next = NULL;    return head;}//遍历链表void DispLink(L *head){    L *p=NULL;    p = head;//指针指向头结点    while(p!=NULL)//如果指针指向不为空    {        printf("%2d", p->data);//指针指向节点的数据域        p = p->next;//指针指向节点的指针域    }    printf("\n");}//释放链表的内存空间void Delete(L *head){    L *p1=NULL, *p2=NULL;    p1 = head;    while(p1!=NULL)    {        p2 = p1->next;//指针 p2 指向下一个节点        free(p1);//释放当前节点的内存        p1 = p2;//指针 p1 指向下一个节点的指针    }}//删除链表节点L *DeleteNode(L *head){    int nodedata;    L *pa = NULL, *pb = NULL;    //提示输入删除节点的数据    printf("delete nodedata:");    scanf("%d", &nodedata);    pa = head;    //如果链表为空,则输出错误提示,返回头指针    if(head==NULL)    {        printf("链表为空表!\n");        return (head);    }    //若沒有找到节点,并且未到链表表尾,则继续查找    while(nodedata != pa->data && pa->next != NULL)    {        pb = pa;        pa = pa->next;    }    //如果找到该节点,则删除该节点    if(nodedata == pa->data)    {        if(pa == head){//如果待删除节点为首节点,则改变头结点指针 head 的指向位置            head = pa->next;        }        else {//如果待删除节点不是首节点,则将前一节点的指针指向当前节点的下一个节点            pb->next = pa->next;        }        free(pa);    }    //没有找到待删除节点,则提示查找失败    else    {        printf("不存在这个数据节点!\n");    }    printf("遍历删除节点后的链表:\n");    DispLink(head);//遍历链表    return (head);//返回删除节点的链表头结点指针}//在升序链表中插入节点L *InsertNode(L *head){    int nodedata;    L *p = NULL, *pa = NULL, *pb = NULL;    //提示输入插入节点的数据    printf("insert nodedata:");    scanf("%d", &nodedata);    p = (L *)malloc(sizeof(L));    if(!p)//如果新建节点内存申请失败,则退出程序    {        printf("No enough memory!\n");        exit(0);    }    p->data = nodedata;    p->next = NULL;    pa = head;    //如果链表为空,则输出错误提示,返回头指针    if(head==NULL)    {        printf("链表为空表!无法插入节点\n");        return (head);    }    else//若链表非空    {        while(nodedata > pa->data && pa->next != NULL)//若沒有找到节点,并且未到链表表尾,则继续查找        {            pb = pa;            pa = pa->next;        }        //如果找到该节点插入位置,则插入该节点        if(nodedata < pa->data)        {            if(pa == head){//在首节点插入新建节点                head = p;                p->next = pa;            }            else {//如果待插入节点不是首节点,则将前一节点的指针指向当前节点                p->next = pb->next;                pb->next = p;            }        }        else//如果未找到该节点插入位置,且新建节点数据值比链表中的所有数据值大,则把新插入的节点插到表尾        {            pa->next = p;            p->next = NULL;        }    }    printf("遍历插入新节点后的链表:\n");    DispLink(head);//遍历链表    return (head);//返回删除节点的链表头结点指针}//主函数,驱动测试void main(){    L *head = NULL;    int i = 0, n = 5;    int nodedata_1, nodedata_2;//分别定义一个插入节点,一个删除节点    for(i=0; i<n; i++)    {        head = AppendNode(head);    }    //遍历链表    printf("遍历原始链表:\n");    DispLink(head);    //删除链表节点    DeleteNode(head);    //插入链表节点    InsertNode(head);    //释放链表的内存空间    Delete(head);}