链表


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



}
原文地址:https://www.cnblogs.com/AmatVictorialCuram/p/4046920.html