我理解的单链表是一个特别简单的东西,可是教科书上给他赋予了太多的含义,使其极不易理解。这点真是很烦人。下面先说说我心中的链表,之后再学习教科书上的。虽然教科书上的东西很多都很死板,不过还是要学的拉。
 
我心中的链表
我心中的链表很是简单,就是一连串数据的链接。它相比数组的优点就在于它的形式比较灵活,插入和删除都比较方便。另外它对数据存储位置的要求比较灵活,各个数据单元存储不必是连续的。这样在数据多时,系统在内存方面处理起来也比较方便。否则系统可能就要为一大块连续的内存忙活一大阵子。好了,废话不多说,看看我心中的链表。单链表(一)_单链表
    这就是我心中的链表,它就是一连串数据单元的链接,从图上看不出太多与教科书上的差别,下面我们从代码上看看。我们每个数据单元为电话簿中的一个联系人。包含姓名和号码。
单链表(一)_职场_02#define    PHB_NAME_LEN     20
单链表(一)_职场_02#define    PHB_NUM_LEN  20
单链表(一)_职场_02
单链表(一)_职场_02typedef struct LinkMan
单链表(一)_职场_02{
单链表(一)_职场_02  char name[PHB_NAME_LEN];
单链表(一)_职场_02  char num[PHB_NUM_LEN];
单链表(一)_职场_02  struct LinkMan *next;
单链表(一)_职场_02}LinkMan,*pLinkMan;
单链表(一)_职场_02
单链表(一)_职场_02int GetPhbLength(pLinkMan phb);
单链表(一)_职场_02
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02/* Function:    InsertLinkMan                                                                                         */
单链表(一)_职场_02/* Description:    Insert a linkman to a phonebook                                                */
单链表(一)_职场_02/* Parameters:                                                                                                                    */
单链表(一)_职场_02/* phb: phonebook , index: the insert position    man: new linkman                */
单链表(一)_职场_02/* Value: void                                                                                                                    */
单链表(一)_职场_02/* Author: Hoiman                                                                                                             */
单链表(一)_职场_02/* Date: 2010/11/05                                                                                                         */
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02void InsertLinkMan(pLinkMan *phb, int index, pLinkMan man)
单链表(一)_职场_02{
单链表(一)_职场_02  int i = 0;
单链表(一)_职场_02  pLinkMan pTemp = *phb;
单链表(一)_职场_02  if (index <= 0)
单链表(一)_职场_02  {
单链表(一)_职场_02    printf("The index must be bigger than zero.\n");
单链表(一)_职场_02    return;
单链表(一)_职场_02  }
单链表(一)_职场_02  else if (index > GetPhbLength(*phb) + 1)
单链表(一)_职场_02  {
单链表(一)_职场_02    printf("The index is bigger than the length of phonebook.\n");
单链表(一)_职场_02    return;
单链表(一)_职场_02  }
单链表(一)_职场_02  else
单链表(一)_职场_02  {
单链表(一)_职场_02    if (1 == index)
单链表(一)_职场_02    {
单链表(一)_职场_02      if (pTemp != NULL)
单链表(一)_职场_02      {
单链表(一)_职场_02        man->next = pTemp->next;
单链表(一)_职场_02        *phb = man;
单链表(一)_职场_02      }
单链表(一)_职场_02      else
单链表(一)_职场_02      {
单链表(一)_职场_02        *phb = man;
单链表(一)_职场_02        man->next = NULL;
单链表(一)_职场_02      }
单链表(一)_职场_02    }
单链表(一)_职场_02    else
单链表(一)_职场_02    {
单链表(一)_职场_02      for (i = 2; i < index; ++i)
单链表(一)_职场_02      {
单链表(一)_职场_02        pTemp = pTemp->next;
单链表(一)_职场_02      }
单链表(一)_职场_02      man->next = pTemp->next;
单链表(一)_职场_02            pTemp->next = man;
单链表(一)_职场_02    }
单链表(一)_职场_02  }
单链表(一)_职场_02}
单链表(一)_职场_02
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02/* Function:    DeleteLinkManByName                                                                             */
单链表(一)_职场_02/* Description:    Delete a linkman from a phonebook by name                            */
单链表(一)_职场_02/* Parameters:                                                                                                                    */
单链表(一)_职场_02/* phb: phonebook , name: the name of linkman will be deleted                     */
单链表(一)_职场_02/* Value: void                                                                                                                    */
单链表(一)_职场_02/* Author: Hoiman                                                                                                             */
单链表(一)_职场_02/* Date: 2010/11/05                                                                                                         */
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02void DeleteLinkManByName(pLinkMan *phb, char *name)
单链表(一)_职场_02{
单链表(一)_职场_02  int i = 0;
单链表(一)_职场_02  pLinkMan pTemp = *phb;
单链表(一)_职场_02  pLinkMan pPrior = pTemp;
单链表(一)_职场_02  int length = GetPhbLength(*phb);
单链表(一)_职场_02  for(i = 0; i < length; ++i)
单链表(一)_职场_02  {
单链表(一)_职场_02    if (0 == strcmp(pTemp->name,name))
单链表(一)_职场_02    {
单链表(一)_职场_02      if (0 == i)
单链表(一)_职场_02      {
单链表(一)_职场_02        *phb = (*phb)->next;
单链表(一)_职场_02        //栈上的空间不能用free进行释放
单链表(一)_职场_02        free(pTemp);
单链表(一)_职场_02        return;
单链表(一)_职场_02      }
单链表(一)_职场_02      else
单链表(一)_职场_02      {
单链表(一)_职场_02        pPrior->next = pTemp->next;
单链表(一)_职场_02        //栈上的空间不能用free进行释放
单链表(一)_职场_02             free(pTemp);
单链表(一)_职场_02        return;
单链表(一)_职场_02      }
单链表(一)_职场_02    }
单链表(一)_职场_02    else
单链表(一)_职场_02    {
单链表(一)_职场_02      pPrior = pTemp;
单链表(一)_职场_02      pTemp = pTemp->next;
单链表(一)_职场_02    }
单链表(一)_职场_02  }
单链表(一)_职场_02  printf("Can't find the linkman in phonebook!\n");
单链表(一)_职场_02}
单链表(一)_职场_02
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02/* Function:    GetPhbLength                                                                                            */
单链表(一)_职场_02/* Description:    Get the number of linkman in phonebook                                 */
单链表(一)_职场_02/* Parameters:                                                                                                                    */
单链表(一)_职场_02/* phb: phonebook                                                                                                             */
单链表(一)_职场_02/* Value: the number of linkman                                                                                 */
单链表(一)_职场_02/* Author: Hoiman                                                                                                             */
单链表(一)_职场_02/* Date: 2010/11/05                                                                                                         */
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02int GetPhbLength(pLinkMan phb)
单链表(一)_职场_02{
单链表(一)_职场_02  int count = 0;
单链表(一)_职场_02  pLinkMan pTemp = phb;
单链表(一)_职场_02        while(pTemp != NULL)
单链表(一)_职场_02  {
单链表(一)_职场_02    pTemp = pTemp->next;
单链表(一)_职场_02    ++count;
单链表(一)_职场_02  }
单链表(一)_职场_02  return count;
单链表(一)_职场_02}
单链表(一)_职场_02
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02/* Function:    DestroyPhb                                                                                                */
单链表(一)_职场_02/* Description:    Destroy the phonebook                                                                    */
单链表(一)_职场_02/* Parameters:                                                                                                                    */
单链表(一)_职场_02/* phb: phonebook                                                                                                             */
单链表(一)_职场_02/* Value: void                                                                                                                    */
单链表(一)_职场_02/* Author: Hoiman                                                                                                             */
单链表(一)_职场_02/* Date: 2010/11/05                                                                                                         */
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02void DestroyPhb(pLinkMan *phb)
单链表(一)_职场_02{
单链表(一)_职场_02  pLinkMan pTemp = *phb;
单链表(一)_职场_02  while (*phb != NULL)
单链表(一)_职场_02  {
单链表(一)_职场_02    *phb = (*phb)->next;
单链表(一)_职场_02    //栈上的空间不能用free进行释放
单链表(一)_职场_02    free(pTemp);
单链表(一)_职场_02    pTemp = *phb;
单链表(一)_职场_02  }
单链表(一)_职场_02}
单链表(一)_职场_02
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02/* Function:    PrintPhb                                                                                                    */
单链表(一)_职场_02/* Description:    print the phonebook                                                                        */
单链表(一)_职场_02/* Parameters:                                                                                                                    */
单链表(一)_职场_02/* phb: phonebook                                                                                                             */
单链表(一)_职场_02/* Value: void                                                                                                                    */
单链表(一)_职场_02/* Author: Hoiman                                                                                                             */
单链表(一)_职场_02/* Date: 2010/11/05                                                                                                         */
单链表(一)_职场_02/************************************************************************/
单链表(一)_职场_02void PrintPhb(pLinkMan phb)
单链表(一)_职场_02{
单链表(一)_职场_02  while(phb != NULL)
单链表(一)_职场_02  {
单链表(一)_职场_02    printf("name: %s\n",phb->name);
单链表(一)_职场_02    printf("num: %s\n",phb->num);
单链表(一)_职场_02    phb = phb->next;
单链表(一)_职场_02  }
单链表(一)_职场_02}