zoukankan      html  css  js  c++  java
  • 链表


    1、实现:创建、销毁、清空、追加、插入、删除、取元素、遍历,8个函数功能。
      
       函数名可参考如下:
       创建CreateList, 销毁DestroyList, 清空ClearList , 追加ListAppend,
       插入ListInsert, 删除ListDelete,  取元素GetElement, 遍历TraverseList

       注意:遍历TraverseList,使用函数指针做参数。

    2、要求:
      
         程序不能有错误和警告。
      
      
    3、测试操作如下(必须按照下面步骤依次操作测试):


       (1)操作内容:将字符串"have a dream?"中的字符依次追加到链表。
        显示链表内容:have a dream?


       (2)操作内容:将字符串"Zo!o u yDX"中的字符依次插入到链表的0,1,15,2,3,3,2,3,1,23位置中。
        显示链表内容:Do you have a dream?!
                 
       (3)操作内容:依次删除链表的0,21,13,17,3,16,11,14,1,10,11,1,9,10位置数据。
        显示链表内容:you have?
              
       (4)操作内容:依次从链表的1,8,6,5,10位置中得到字符yeah,并显示字符。
        显示得到结果:yeah
       
       (5)操作内容:清空链表并显示链表内容
        显示链表内容:

       (6)操作内容:销毁链表
        显示操作内容:DestroyList

    typedef char EleType;
    
    typedef struct Node
    {
            EleType data;
            struct Node *next;
    }
    ChainNode;
    
    typedef struct
    {
            ChainNode *head;
    }
    List ;
    
    List *CreateList();
    
    void ListDestroy(List *lp);
    
    void ListClear(List *lp);
    
    int ListAppend(List *lp , EleType data);
    
    int ListInsert(List *lp, int n , EleType data);
    
    int ListDelete(List *lp , int n);
    
    int GetElement(List *lp , int n ,EleType *data);
    
    ChainNode *GetAddr(List *lp , int n);
    
    ChainNode *NewChainNode(EleType data);
    
    int TraverseList(List *lp , int (*f)(EleType *));
    
    List *CreateList()
    {
            List *lp;
            lp = (List *)malloc(sizeof(List));
            if(!lp) return 0;
            lp ->head = NewChainNode(0);
            if(!lp -> head)
            {
                    free(lp);
                    return 0;
            }
            return lp;
    }
    
    void ListDestroy(List *lp)
    {
            ListClear(lp);
            free(lp->head);
            free(lp);
            printf("DestroyList
    ");
    }
    
    void ListClear(List *lp)
    {
            while(ListDelete(lp,1));
    }
    
    int ListAppend(List *lp , EleType data)
    {
            ChainNode *newp , *p;
            newp = NewChainNode(data);
            if(!newp )  return 0;
            for(p =lp->head;p->next;p =p->next);
            p->next = newp;
            return 1;
    }
    
    int ListInsert(List *lp, int n , EleType data)
    {
           ChainNode *newp , *p;
           if(n<1) return 0;
            newp = NewChainNode(data);
            if(!newp )  return 0;
            p = GetAddr(lp,n-1);
            if(!p ) return 0;
            newp ->next = p->next;
            p ->next = newp ;
            return 1;
    
    }
    
    int ListDelete(List *lp , int n)
    {
           ChainNode *p , *pr;
           if(n<1) return 0;
            p = GetAddr(lp , n-1);
            if(!(p&&p->next)) return 0;
            pr =p->next;
            p->next = pr->next;
            free(pr);
            return 1;
    }
    
    int GetElement(List *lp , int n ,EleType *data)
    {
           ChainNode *p ;
           if(n<1)   return 0;
            p = GetAddr(lp , n);
            if(!p)   return 0;
            *data = p ->data ;
            return 1;
    }
    
    ChainNode *GetAddr(List *lp , int n)
    {
            int count = 0;
            ChainNode *p;
            for(p = lp->head;p&&count < n; p=p->next)
            {
                    count ++;
            }
            if(!p) return 0;
            return p;
    }
    
    ChainNode *NewChainNode(EleType data)
    {
            ChainNode *newp;
            newp = (ChainNode *)malloc(sizeof(ChainNode));
            if(!newp ) return 0;
            newp -> data = data;
            newp -> next = 0;
            return newp;
    }
    
    int TraverseList(List *lp , int (*f)(EleType *))
    {
            int count = 1;
            ChainNode *p;
            for(p =lp->head->next;p;p=p->next)
            {
                    if(!f(&p->data)) return count ;
                    count ++;
            }
            printf("
    ");
            return 0;
    }
    
    int show(EleType *data)
    {
        printf("%c",*data);
    }
    
    main()
    {
        List *lp;
        int n ,Inaddr[10] = {0,1,15,2,3,3,2,3,1,23};
        int Deladdr[14]= {0,21,13,17,3,16,11,14,1,10,11,1,9,10};
        int gete[5] = {1,8,6,5,10};
        char getE[5] , In[15] = {'Z','o','!','o',' ','u',' ', 'y','D','X'};
    
        char s[30] = "have a dream";
    
    
        lp = CreateList();
        for(n=0;s[n];n ++)
        {
            ListAppend(lp,s[n]);
        }
        TraverseList(lp , show);
    
        for(n=0;n<10;n++)
        {
            ListInsert(lp,Inaddr[n],In[n]);
        }
        TraverseList(lp , show);
    
        for(n=0;n<14;n++)
        {
            ListDelete(lp ,Deladdr[n]);
        }
        TraverseList(lp , show);
    
        for(n= 0;n<5;n++)
        {
            GetElement(lp,gete[n],getE+n);
            printf("%c",getE[n]);       getE[n+1] = ' ';
        }
        printf("
    ");
    
        ListClear(lp);
        TraverseList(lp,show);
    
        ListDestroy(lp);
    
    
    
    }
  • 相关阅读:
    [java初探06]__排序算法的简单认识
    [java初探05]__数组的简单认识及Arrays类的常用方法
    [java工具类01]__构建格式化输出日期和时间的工具类
    [Java初探04]__字符串(String类)相关
    [Java初探实例篇02]__流程控制语句知识相关的实例练习
    【Java初探03】——流程控制语句
    iOS ipv6 被拒
    iOS工程中如何去掉第三方的警告
    iOS面试准备之思维导图(转)
    UML图基本类型
  • 原文地址:https://www.cnblogs.com/AmatVictorialCuram/p/4046920.html
Copyright © 2011-2022 走看看