【算法和数据结构】_5_线性结构_单链表

来源:互联网 发布:网络体育关注 编辑:程序博客网 时间:2024/04/27 14:19

 /*    本程序用来测试线性存储结构:链表*/#include <stdio.h>#include <stdlib.h>//*************************************************//       定义处理字符的链表数据类型struct singlelink{    short int data;    struct singlelink* next;};//单链表struct doublelink{    int data;    struct doublelink* prenode;    struct doublelink* postnode;};//双链表typedef struct singlelink  SIGLINK;typedef SIGLINK* PSIGLINK;typedef struct doublelink  DBLLINK;//**************************************************//**************************************************//        定义申请地址空间宏#define  MALLOC(pNode,Type,size)\        if(NULL==\            (pNode=(Type *)malloc(sizeof(Type)*size))\         )\{\    return FALSE;\}//**************************************************//**************************************************//        定义BOOL数据类型typedef enum {FALSE,TRUE} BOOL;//**************************************************SIGLINK* CreateSingleLink(void);BOOL InitSigLink(SIGLINK* head,char element[]);void EchoSigLink(PSIGLINK head);BOOL AppendToEnd(PSIGLINK head,char element);PSIGLINK SearchNodeSig(PSIGLINK head,char element);BOOL DelNodeSig(PSIGLINK head,char element);BOOL DestroySigLink(PSIGLINK head);BOOL  IsSigLinkEmpty(PSIGLINK head);int main(int argc,char* argv[]){    PSIGLINK head;    if(NULL==(head=CreateSingleLink()))    {        puts("Error.\n");    }    if(IsSigLinkEmpty(head))        puts("Yes.\n");    if(!InitSigLink(head,"Hello wold"))    {        puts("Error.\n");    }    EchoSigLink(head);    AppendToEnd(head,'A');    EchoSigLink(head);    if(SearchNodeSig(head,'e'))        puts("Exist element");    DelNodeSig(head,'A');    EchoSigLink(head);    if(DestroySigLink(head))        if(IsSigLinkEmpty(head))            puts("Yes.\n");        EchoSigLink(head);    getchar();    getchar();    return 0;}//**************************************************/*函数功能:    创建链表的表头,    并将表头的数字域设置为 '\0' 、表头下一个指向域为空函数原型:    SIGLINK* CreateSingleLink(void)函数参数:    无参数返回值:    如果创建表头成功,则返回表头指针;否则返回空指针异常:    无*/SIGLINK* CreateSingleLink(void){    SIGLINK* head;    head=(SIGLINK*)malloc(sizeof(SIGLINK));        if(NULL==head)    {        return NULL;    }        head->next=NULL;    head->data ='\0';        return head;}//**************************************************//**************************************************/*函数功能:    初始化链表:申请节点空间和设置值域函数原型:    BOOL InitSigLink(SIGLINK* head,char element[])函数参数:    SIGLINK* head:要初始化的链表头指针    char element[]:用来初始化链表以'\0'结尾的字符串返回值:    如果初始化成功,则返回TRUE;否则返回FALSE异常:    传递空指针*/BOOL InitSigLink(SIGLINK* head,char element[]){    PSIGLINK temp,             end;    int i;    if(NULL==head || element==NULL )    {        return FALSE;    }    end=head;    for(i=0; element[i] != '\0';i++)    {        MALLOC(temp,SIGLINK,1);        temp->data='\0';        temp->next =NULL;        end->data=element[i];        end->next=temp;                end=temp;    }        return TRUE;}//**************************************************//**************************************************/*函数功能:    显示链表函数原型:    void EchoSigLink(PSIGLINK head)函数参数:    PSIGLINK head: 要显示的链表的头指针返回值:    无异常:    传递空指针*/void EchoSigLink(PSIGLINK head){    PSIGLINK temp;    if(NULL==head)    {        puts("Error.\n");        return ;    }    else    {        temp=head;        while(NULL != temp->next )        {            printf("%c",temp->data );            temp=temp->next ;        }        putchar('\n');        return ;    }}//**************************************************//**************************************************/*函数功能:    获取最后一个节点的指针函数原型:    PSIGLINK  GetEndNode(PSIGLINK head)函数参数:    PSIGLINK head:链表头指针返回值:    如果执行成功,则返回尾指针;否则返回NULL异常:    无*/PSIGLINK  GetEndNode(PSIGLINK head){    PSIGLINK temp;    if(!(temp=head))    {        return NULL;    }    else    {        while(temp->next)        {            temp=temp->next ;        }        return temp;    }}//**************************************************//**************************************************/*函数功能:    在链表的尾端增加节点函数原型:    BOOL AppendToEnd(PSIGLINK head,char element)函数参数:    PSIGLINK head:要增加元素的链表的头节点    char element:要增加的元素返回值:    成功增加返回TRUE,否则返回FALSE异常:    无*/BOOL AppendToEnd(PSIGLINK head,char element){    PSIGLINK end,             temp;    end=GetEndNode(head);    if(!end)    {        return FALSE;    }    else    {        //分配空间,并设置最后一个节点        MALLOC(temp,SIGLINK,1)        temp->data='\0';        temp->next =NULL;        //将最后一个节点设置为新增的节点        end->data =element;        end->next=temp;        return TRUE;    }}//**************************************************//**************************************************/*函数功能:    查找元素,函数原型    PSIGLINK SearchNodeSig(PSIGLINK head,char element)函数参数:    PSIGLINK head:待查找头指针    char element:要查找的元素返回值:    如果存在就返回节点指针,否则返回NULL异常:    传递空指针*/PSIGLINK SearchNodeSig(PSIGLINK head,char element){    PSIGLINK temp;    temp=head;        //设计仅有表头节点的时候,不存储元素    //所以可以这样判断    if(!temp || !temp->next )        return NULL;    while(temp->next)    {        if(element == temp->data )        {            return temp;        }        temp=temp->next ;    }    return NULL;}//**************************************************//**************************************************/*函数功能:    在指定的元素后面插入节点,    1、如果指定元素存在就将节点插入到指定元素之后    2、如果指定元素不存在就插入到链表最后函数原型:    BOOL InsertNodeSig(PSIGLINK head,char element)函数参数    PSIGLINK head:表头指针    char element:指定元素返回值:    插入成功,则返回TRUE,否则返回FALSE异常:    无*/BOOL InsertNodeSig(PSIGLINK head,char elementPos,char element){    PSIGLINK temp,             NewNode;    if(!head)    {        return FALSE;    }        //处理仅有头节点的情况    if(!head->next)    {         if(AppendToEnd(head,element))            return TRUE;        else            return FALSE;    }/*    //处理仅有一个节点的情况    //无论是否存在指定元素,都将插入一个节点    if(head->next->next ==NULL)    {        MALLOC(NewNode,SIGLINK,1);        NewNode->data =element;        NewNode->next=head->next ;        head->next =NewNode;        free(NewNode);        return TRUE;    }*/    temp=SearchNodeSig(head,elementPos);    if(temp)    {        //存在指定元素        MALLOC(NewNode,SIGLINK,1);        NewNode->data =element;        NewNode->next =temp->next;        temp->next =NewNode;        free(NewNode);        return TRUE;    }    else    {        //如果不存在指定元素,将元素插入到最后        if(AppendToEnd(head,element))            return TRUE;        else            return FALSE;    }}//**************************************************//**************************************************/*函数功能:    删除指定元素函数原型:    BOOL DelNodeSig(PSIGLINK *head,char element)函数参数:    PSIGLINK *head: 链表头指针    char element:要删除的元素返回值:    如果删除成功,则返回TRUE;否则返回FALSE异常:    无*/BOOL DelNodeSig(PSIGLINK head,char element){    PSIGLINK temp,             DeNode;        //仅有头节点    if(!head->next)    {        return  FALSE;    }    //仅有一个节点    if(!head->next->next)    {        if(head->data == element)        {            DeNode=head;            head=head->next;                        free(DeNode);            return TRUE;        }        else        {            return FALSE;        }    }        temp=head;    while(temp->next)    {        if(temp->next->data ==element)        {            DeNode=temp->next ;            temp->next =temp->next ->next ;                        free(DeNode);            return TRUE;        }        temp=temp->next ;    }    return FALSE;}//**************************************************//**************************************************/*函数功能:    销毁链表函数原型:    BOOL DestroySigLink(PSIGLINK head)函数参数:    PSIGLINK head: 待销毁链表头指针返回值:    成功销毁,返回TRUE,否则返回FALSE异常:    无*/BOOL DestroySigLink(PSIGLINK head){    PSIGLINK temp;    if(NULL== head)    {        return FALSE;    }    else    {        if(head->next ==NULL)            return TRUE;        else        {            while(NULL != head->next->next )            {                temp=head->next ;                head->next=head->next->next;                free(temp);            }            temp=head->next ;            head->next =NULL;            head->data ='\0';            free(temp);            return TRUE;        }    }}//**************************************************//**************************************************/*函数功能:    判断是否为空表    1、仅有头节点时表为空函数原型    BOOL  IsSigLinkEmpty(PSIGLINK head)函数参数:    PSIGLINK head:链表头指针返回值:    如果为空,返回TRUE,否则返回FALSE异常:    无*/BOOL  IsSigLinkEmpty(PSIGLINK head){    if(head && NULL==head->next )        return TRUE;    else        return FALSE;}//**************************************************

运行结果如下所示:


<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击