科技之所以在不断地发展进步,其中最大的原因就是人们心中那种贪欲与不知足。说好听一点就是永不止步的探索精神,说不好听一点就是人类或是隐藏或是显示的懒惰与贪欲。呵呵,不过虽然如此,任何事物都有两面性的,对现实生活的不知足可能早就你一个辉煌的人生,也可能让你彻底坠入深渊。不过在学术上,科学上它表现出的大多是积极的一面。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

好了,废话不多说,上篇的单链表用起来已是很方便了,可是勇于探索的精神又让人们给他加上了点修饰-头结点。即在链表的初始位置加上一个结点,它不属于链表的内容之一。只是一个标志。它的好处在于使我们能够容易定位到第一个结点。也许这句话说的不是很明白。但我们看下上篇写的链表的插入删除函数就明白了。在我们上篇的插入和删除函数中都把插入第一个结点和删除第一个结点单拉出来考虑了。因为他们的操作与众不同。这样函数实现起来容易出错,并且代码多而有些乱,不易读。带头结点的链表就去除了这个缺点。下面我们看下带头结点链表的定义及实现。
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.gifvoid InitPhoneBook(pPhoneBook phb)
InBlock.gif{
InBlock.gif  pLinkMan man = (pLinkMan)malloc(sizeof(LinkMan));
InBlock.gif  phb->first = man;
InBlock.gif  phb->last = man;
InBlock.gif  phb->len = 0;
InBlock.gif  man->next = NULL;
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.gifvoid 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    for (i = 1; 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    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.gifvoid DeleteLinkManByName(pPhoneBook phb, char *name)
InBlock.gif{
InBlock.gif  int i = 0;
InBlock.gif  pLinkMan pTemp = (phb->first)->next;
InBlock.gif  pLinkMan pPrior = phb->first;
InBlock.gif  for(i = 0; i < phb->len; ++i)
InBlock.gif  {
InBlock.gif    if (0 == strcmp(pTemp->name,name))
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      phb->len--;
InBlock.gif      //栈上的空间不能用free进行释放
InBlock.gif        //    free(pTemp);
InBlock.gif      return;
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}