科技之所以在不断地发展进步,其中最大的原因就是人们心中那种贪欲与不知足。说好听一点就是永不止步的探索精神,说不好听一点就是人类或是隐藏或是显示的懒惰与贪欲。呵呵,不过虽然如此,任何事物都有两面性的,对现实生活的不知足可能早就你一个辉煌的人生,也可能让你彻底坠入深渊。不过在学术上,科学上它表现出的大多是积极的一面。
好了,废话不多说,上篇的单链表用起来已是很方便了,可是勇于探索的精神又让人们给他加上了点修饰-头结点。即在链表的初始位置加上一个结点,它不属于链表的内容之一。只是一个标志。它的好处在于使我们能够容易定位到第一个结点。也许这句话说的不是很明白。但我们看下上篇写的链表的插入删除函数就明白了。在我们上篇的插入和删除函数中都把插入第一个结点和删除第一个结点单拉出来考虑了。因为他们的操作与众不同。这样函数实现起来容易出错,并且代码多而有些乱,不易读。带头结点的链表就去除了这个缺点。下面我们看下带头结点链表的定义及实现。
单链表(三)_头结点PhoneBook phonebook;
单链表(三)_头结点
单链表(三)_头结点/************************************************************************/
单链表(三)_头结点/* Function:    InitPhoneBook                                                                                         */
单链表(三)_头结点/* Description:    Init a phonebook                                                                             */
单链表(三)_头结点/* Parameters:                                                                                                                    */
单链表(三)_头结点/* phb: phonebook                                                                                                             */
单链表(三)_头结点/* Value: void                                                                                                                    */
单链表(三)_头结点/* Author: Hoiman                                                                                                             */
单链表(三)_头结点/* Date: 2010/11/05                                                                                                         */
单链表(三)_头结点/************************************************************************/
单链表(三)_头结点void InitPhoneBook(pPhoneBook phb)
单链表(三)_头结点{
单链表(三)_头结点  pLinkMan man = (pLinkMan)malloc(sizeof(LinkMan));
单链表(三)_头结点  phb->first = man;
单链表(三)_头结点  phb->last = man;
单链表(三)_头结点  phb->len = 0;
单链表(三)_头结点  man->next = NULL;
单链表(三)_头结点}
单链表(三)_头结点
单链表(三)_头结点/************************************************************************/
单链表(三)_头结点/* 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
单链表(三)_头结点  {
单链表(三)_头结点    for (i = 1; 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)->next;
单链表(三)_头结点  pLinkMan pPrior = phb->first;
单链表(三)_头结点  for(i = 0; i < phb->len; ++i)
单链表(三)_头结点  {
单链表(三)_头结点    if (0 == strcmp(pTemp->name,name))
单链表(三)_头结点    {
单链表(三)_头结点      pPrior->next = pTemp->next;
单链表(三)_头结点      if (pTemp == phb->last)
单链表(三)_头结点      {
单链表(三)_头结点        phb->last = pPrior;
单链表(三)_头结点      }
单链表(三)_头结点      phb->len--;
单链表(三)_头结点      //栈上的空间不能用free进行释放
单链表(三)_头结点        //    free(pTemp);
单链表(三)_头结点      return;
单链表(三)_头结点    }
单链表(三)_头结点    else
单链表(三)_头结点    {
单链表(三)_头结点      pPrior = pTemp;
单链表(三)_头结点      pTemp = pTemp->next;
单链表(三)_头结点    }
单链表(三)_头结点  }
单链表(三)_头结点  printf("Can't find the linkman in phonebook!\n");
单链表(三)_头结点}