上篇说了我心中的链表,它很是简单,就是一个简简单单的数据的链接,链表就是数据单元类型的指针。而教科书上的链表就相对复杂了些。如它会为链表单独定义一种类型。这点在开始学习链表的时候总是弄糊涂。下面就看看教科书上是如何定义链表类型的。例子还是上篇的电话簿。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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