上篇说了我心中的链表,它很是简单,就是一个简简单单的数据的链接,链表就是数据单元类型的指针。而教科书上的链表就相对复杂了些。如它会为链表单独定义一种类型。这点在开始学习链表的时候总是弄糊涂。下面就看看教科书上是如何定义链表类型的。例子还是上篇的电话簿。
第一步:定义结点类型。
单链表(二)_单向链表typedef struct LinkMan
单链表(二)_单向链表{
单链表(二)_单向链表  char name[PHB_NAME_LEN];
单链表(二)_单向链表  char num[PHB_NUM_LEN];
单链表(二)_单向链表  struct LinkMan *next;
单链表(二)_单向链表}LinkMan,*pLinkMan;
第二步:定义链表类型:
单链表(二)_单向链表typedef struct PhoneBook
单链表(二)_单向链表{
单链表(二)_单向链表  pLinkMan first;            //头指针
单链表(二)_单向链表  pLinkMan last;            //尾指针
单链表(二)_单向链表  int len;                         //链表长度
单链表(二)_单向链表}PhoneBook,*pPhoneBook;
有的没有尾指针,只有头指针。定义如下:
单链表(二)_单向链表typedef struct PhoneBook
单链表(二)_单向链表{
单链表(二)_单向链表  pLinkMan first;            //头指针
单链表(二)_单向链表  int len;                         //链表长度
单链表(二)_单向链表}PhoneBook,*pPhoneBook;
OK,到目前为止,一个链表类型基本就定义完成了,剩下的就是使用了。虽然这种定义开起来容易使初学者糊涂,但它还是蛮好用的。下面就简单看下它的使用:
单链表(二)_单向链表PhoneBook phonebook;
单链表(二)_单向链表
单链表(二)_单向链表/************************************************************************/
单链表(二)_单向链表/* Function:    InitPhoneBook                                                                                         */
单链表(二)_单向链表/* Description:    Init a phonebook                                                                             */
单链表(二)_单向链表/* Parameters:                                                                                                                    */
单链表(二)_单向链表/* phb: phonebook                                                                                                             */
单链表(二)_单向链表/* Value: void                                                                                                                    */
单链表(二)_单向链表/* Author: Hoiman                                                                                                             */
单链表(二)_单向链表/* Date: 2010/11/05                                                                                                         */
单链表(二)_单向链表/************************************************************************/
单链表(二)_单向链表void InitPhoneBook(pPhoneBook phb)
单链表(二)_单向链表{
单链表(二)_单向链表  phb->first = NULL;
单链表(二)_单向链表  phb->last = NULL;
单链表(二)_单向链表  phb->len = 0;
单链表(二)_单向链表}
单链表(二)_单向链表
单链表(二)_单向链表/************************************************************************/
单链表(二)_单向链表/* Function:    InsertLinkMan                                                                                         */
单链表(二)_单向链表/* Description:    Insert a linkman to a phonebook                                                */
单链表(二)_单向链表/* Parameters:                                                                                                                    */
单链表(二)_单向链表/* phb: phonebook , index: the insert position    man: new linkman                */
单链表(二)_单向链表/* Value: void                                                                                                                    */
单链表(二)_单向链表/* Author: Hoiman                                                                                                             */
单链表(二)_单向链表/* Date: 2010/11/05                                                                                                         */
单链表(二)_单向链表/************************************************************************/
单链表(二)_单向链表void InsertLinkMan(pPhoneBook phb, int index, pLinkMan man)
单链表(二)_单向链表{
单链表(二)_单向链表  int i = 0;
单链表(二)_单向链表  pLinkMan pTemp = phb->first;
单链表(二)_单向链表  if (index <= 0)
单链表(二)_单向链表  {
单链表(二)_单向链表    printf("The index must be bigger than zero.\n");
单链表(二)_单向链表    return;
单链表(二)_单向链表  }
单链表(二)_单向链表  else if (index > phb->len + 1)
单链表(二)_单向链表  {
单链表(二)_单向链表    printf("The index is bigger than the length of phonebook.\n");
单链表(二)_单向链表    return;
单链表(二)_单向链表  }
单链表(二)_单向链表  else
单链表(二)_单向链表  {
单链表(二)_单向链表    if (1 == index)
单链表(二)_单向链表    {
单链表(二)_单向链表      if (pTemp != NULL)
单链表(二)_单向链表      {
单链表(二)_单向链表        man->next = pTemp;
单链表(二)_单向链表        phb->first = man;
单链表(二)_单向链表      }
单链表(二)_单向链表      else
单链表(二)_单向链表      {
单链表(二)_单向链表        phb->first = man;
单链表(二)_单向链表        phb->last = man;
单链表(二)_单向链表        man->next = NULL;
单链表(二)_单向链表      }
单链表(二)_单向链表    }
单链表(二)_单向链表    else
单链表(二)_单向链表    {
单链表(二)_单向链表      for (i = 2; i < index; ++i)
单链表(二)_单向链表      {
单链表(二)_单向链表        pTemp = pTemp->next;
单链表(二)_单向链表      }
单链表(二)_单向链表      man->next = pTemp->next;
单链表(二)_单向链表            pTemp->next = man;
单链表(二)_单向链表    }
单链表(二)_单向链表    phb->len++;
单链表(二)_单向链表  }
单链表(二)_单向链表}
单链表(二)_单向链表
单链表(二)_单向链表/************************************************************************/
单链表(二)_单向链表/* Function:    DeleteLinkManByName                                                                             */
单链表(二)_单向链表/* Description:    Delete a linkman from a phonebook by name                            */
单链表(二)_单向链表/* Parameters:                                                                                                                    */
单链表(二)_单向链表/* phb: phonebook , name: the name of linkman will be deleted                     */
单链表(二)_单向链表/* Value: void                                                                                                                    */
单链表(二)_单向链表/* Author: Hoiman                                                                                                             */
单链表(二)_单向链表/* Date: 2010/11/05                                                                                                         */
单链表(二)_单向链表/************************************************************************/
单链表(二)_单向链表void DeleteLinkManByName(pPhoneBook phb, char *name)
单链表(二)_单向链表{
单链表(二)_单向链表  int i = 0;
单链表(二)_单向链表  pLinkMan pTemp = phb->first;
单链表(二)_单向链表  pLinkMan pPrior = pTemp;
单链表(二)_单向链表  for(i = 0; i < phb->len; ++i)
单链表(二)_单向链表  {
单链表(二)_单向链表    if (0 == strcmp(pTemp->name,name))
单链表(二)_单向链表    {
单链表(二)_单向链表      if (0 == i)
单链表(二)_单向链表      {
单链表(二)_单向链表        phb->first = (phb->first)->next;
单链表(二)_单向链表        //栈上的空间不能用free进行释放
单链表(二)_单向链表      //  free(pTemp);
          phb->len--;
单链表(二)_单向链表        return;
单链表(二)_单向链表      }
单链表(二)_单向链表      else
单链表(二)_单向链表      {
单链表(二)_单向链表        pPrior->next = pTemp->next;
单链表(二)_单向链表        if (pTemp == phb->last)
单链表(二)_单向链表        {
单链表(二)_单向链表          phb->last = pPrior;
单链表(二)_单向链表        }
单链表(二)_单向链表        //栈上的空间不能用free进行释放
单链表(二)_单向链表         //    free(pTemp);
           phb->len--;
单链表(二)_单向链表        return;
单链表(二)_单向链表      }
单链表(二)_单向链表    }
单链表(二)_单向链表    else
单链表(二)_单向链表    {
单链表(二)_单向链表      pPrior = pTemp;
单链表(二)_单向链表      pTemp = pTemp->next;
单链表(二)_单向链表    }
单链表(二)_单向链表  }
单链表(二)_单向链表  printf("Can't find the linkman in phonebook!\n");
单链表(二)_单向链表}