指针的存在对一部分人来说是一种享受,因为他们可以轻松自如的操作内存。然而对另一部人来说却是煎熬,他们害怕指针,因为它总会令他们想起那些莫名其妙的内存错误。这使他们十分头疼。而链表操作的方便却又令他们割舍不下,于是有些人设计出了一个不用指针也可以达到插入元素不用移动的数据结构,那就是静态链表。不过它存在着必须一次性申请够内存空间的缺点。不过小碍无伤大雅。静态链表有多个版本的存在,我们用发展的眼光一路跟随静态链表走来:
我心中的静态链表
       我心中的静太链表与教科书上的还是很有差别的,初学静态链表我翻了好几本教科书,都没有把静态链表的思想搞明白,于是就出现了我自己的静态链表。
(1)   定义
静态链表(一)_休闲#define    PHB_NAME_LEN     20
静态链表(一)_休闲#define    PHB_NUM_LEN             20
静态链表(一)_休闲#define    MAXSIZE                100
静态链表(一)_休闲typedef struct LinkMan
静态链表(一)_休闲{
静态链表(一)_休闲             char name[PHB_NAME_LEN];
静态链表(一)_休闲             char num[PHB_NUM_LEN];
静态链表(一)_休闲}LinkMan,*pLinkMan;
静态链表(一)_休闲typedef struct    
静态链表(一)_休闲{
静态链表(一)_休闲             LinkMan data;
静态链表(一)_休闲             int cur;
静态链表(一)_休闲}OneLinkMan,PhoneBook[MAXSIZE];
(2)   初始化
       cur代表链表中的下一个元素的索引。IsNull代表当前空间是否存储元素。链表的第一个存储空间作为备用链表的头结点,不存储元素。如PhoneBook[0].cur存储的就是第一个可用的链表空间。即PhoneBook[0]为备用链表的头结点。链表的第二个空间PhoneBook[1]同样不存储元素,作为已用链表的头结点。
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14/* Function:    InitPhoneBook                                                                                         */
静态链表(一)_职场_14/* Description:    Init a phonebook                                                                             */
静态链表(一)_职场_14/* Parameters:                                                                                                                    */
静态链表(一)_职场_14/* phb: phonebook                                                                                                             */
静态链表(一)_职场_14/* Value: void                                                                                                                    */
静态链表(一)_职场_14/* Author: Hoiman                                                                                                             */
静态链表(一)_职场_14/* Date: 2010/11/05                                                                                                         */
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14void InitPhoneBook(OneLinkMan *phb)
静态链表(一)_职场_14{
静态链表(一)_职场_14  int i = 0;
静态链表(一)_职场_14  for (i = 2; i < MAXSIZE-1; ++i)
静态链表(一)_职场_14  {
静态链表(一)_职场_14    phb[i].cur = i + 1;
静态链表(一)_职场_14  }
静态链表(一)_职场_14  phb[0].cur = 2;
静态链表(一)_职场_14  phb[1].cur = 0;
静态链表(一)_职场_14  phb[MAXSIZE-1].cur = 0;
静态链表(一)_职场_14}
(3)   获得备用空间
       从备用链表上取下一个备用空间进行存储。一般去备用链表中的第一个可用空间,即PhoneBook[0].cur。如果PhoneBook[0].cur == 0,代表当前存储空间已满。备用链表为空。否则返回当前存储空间的索引。
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14/* Function:    MallocInsert                                                                                            */
静态链表(一)_职场_14/* Description:    Get a spare space index                                                                */
静态链表(一)_职场_14/* Parameters:                                                                                                                    */
静态链表(一)_职场_14/* phb: phonebook                                                                                                             */
静态链表(一)_职场_14/* Value: void                                                                                                                    */
静态链表(一)_职场_14/* Author: Hoiman                                                                                                             */
静态链表(一)_职场_14/* Date: 2010/11/05                                                                                                         */
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14int MallocInsert(OneLinkMan *phb)
静态链表(一)_职场_14{
静态链表(一)_职场_14  int i = phb[0].cur;
静态链表(一)_职场_14  if (i)
静态链表(一)_职场_14  {
静态链表(一)_职场_14    phb[0].cur = phb[i].cur;
静态链表(一)_职场_14    return i;
静态链表(一)_职场_14  }
静态链表(一)_职场_14  return 0;
静态链表(一)_职场_14}
(4)其他代码
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14/* Function:    FreeDelete                                                                                                */
静态链表(一)_职场_14/* Description:    get back a spare space index                                                     */
静态链表(一)_职场_14/* Parameters:                                                                                                                    */
静态链表(一)_职场_14/* phb: phonebook index: the index give back                                                        */
静态链表(一)_职场_14/* Value: void                                                                                                                    */
静态链表(一)_职场_14/* Author: Hoiman                                                                                                             */
静态链表(一)_职场_14/* Date: 2010/11/05                                                                                                         */
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14void FreeDelete(OneLinkMan *phb, int index)
静态链表(一)_职场_14{
静态链表(一)_职场_14  phb[index].cur = phb[0].cur;
静态链表(一)_职场_14  phb[0].cur = index;
静态链表(一)_职场_14}
静态链表(一)_职场_14
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14/* Function:    InsertLinkMan                                                                                         */
静态链表(一)_职场_14/* Description:    Insert a linkman to a phonebook                                                */
静态链表(一)_职场_14/* Parameters:                                                                                                                    */
静态链表(一)_职场_14/* phb: phonebook , index: the insert position    man: new linkman                */
静态链表(一)_职场_14/* Value: void                                                                                                                    */
静态链表(一)_职场_14/* Author: Hoiman                                                                                                             */
静态链表(一)_职场_14/* Date: 2010/11/05                                                                                                         */
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14void InsertLinkMan(OneLinkMan *phb, int index, pLinkMan man)
静态链表(一)_职场_14{
静态链表(一)_职场_14  int i = MallocInsert(phb);
静态链表(一)_职场_14  int j = 0;
静态链表(一)_职场_14  int count = 1;
静态链表(一)_职场_14  if (index <= 0)
静态链表(一)_职场_14  {
静态链表(一)_职场_14    printf("The index must be bigger than zero!\n");
静态链表(一)_职场_14  }
静态链表(一)_职场_14  if (0 == i)
静态链表(一)_职场_14  {
静态链表(一)_职场_14    printf("There is no spare space!\n");
静态链表(一)_职场_14  }
静态链表(一)_职场_14  else
静态链表(一)_职场_14  {
静态链表(一)_职场_14    strcpy(phb[i].data.name,man->name);
静态链表(一)_职场_14    strcpy(phb[i].data.num,man->num);
静态链表(一)_职场_14    j = 1;
静态链表(一)_职场_14    do
静态链表(一)_职场_14    {
静态链表(一)_职场_14      if (count == index)
静态链表(一)_职场_14      {
静态链表(一)_职场_14        break;
静态链表(一)_职场_14      }
静态链表(一)_职场_14      count++;
静态链表(一)_职场_14      j = phb[j].cur;
静态链表(一)_职场_14    }while (phb[j].cur);
静态链表(一)_职场_14    if (count < index)
静态链表(一)_职场_14    {
静态链表(一)_职场_14      printf("Too big index~!\n");
静态链表(一)_职场_14      return;
静态链表(一)_职场_14    }
静态链表(一)_职场_14    phb[i].cur = phb[j].cur;
静态链表(一)_职场_14    phb[j].cur = i;
静态链表(一)_职场_14  }
静态链表(一)_职场_14}
静态链表(一)_职场_14
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14/* Function:    DeleteLinkManByName                                                                             */
静态链表(一)_职场_14/* Description:    Delete a linkman from a phonebook by name                            */
静态链表(一)_职场_14/* Parameters:                                                                                                                    */
静态链表(一)_职场_14/* phb: phonebook , name: the name of linkman will be deleted                     */
静态链表(一)_职场_14/* Value: void                                                                                                                    */
静态链表(一)_职场_14/* Author: Hoiman                                                                                                             */
静态链表(一)_职场_14/* Date: 2010/11/05                                                                                                         */
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14void DeleteLinkManByName(OneLinkMan *phb, char *name)
静态链表(一)_职场_14{
静态链表(一)_职场_14  int i = 1;
静态链表(一)_职场_14  while (phb[i].cur)
静态链表(一)_职场_14  {
静态链表(一)_职场_14    if (0 == strcmp((phb[i+1].data).name,name))
静态链表(一)_职场_14    {
静态链表(一)_职场_14      phb[i].cur = phb[i+1].cur;
静态链表(一)_职场_14      FreeDelete(phb,i+1);
静态链表(一)_职场_14      return;
静态链表(一)_职场_14    }
静态链表(一)_职场_14    else
静态链表(一)_职场_14    {
静态链表(一)_职场_14      i = phb[i].cur;
静态链表(一)_职场_14    }
静态链表(一)_职场_14  }
静态链表(一)_职场_14  printf("Can't find the linkman in phonebook!\n");
静态链表(一)_职场_14}
静态链表(一)_职场_14
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14/* Function:    PrintPhb                                                                                                    */
静态链表(一)_职场_14/* Description:    print the phonebook                                                                        */
静态链表(一)_职场_14/* Parameters:                                                                                                                    */
静态链表(一)_职场_14/* phb: phonebook                                                                                                             */
静态链表(一)_职场_14/* Value: void                                                                                                                    */
静态链表(一)_职场_14/* Author: Hoiman                                                                                                             */
静态链表(一)_职场_14/* Date: 2010/11/05                                                                                                         */
静态链表(一)_职场_14/************************************************************************/
静态链表(一)_职场_14void PrintPhb(OneLinkMan *phb)
静态链表(一)_职场_14{
静态链表(一)_职场_14  int i = 1;
静态链表(一)_职场_14  int j = 0;
静态链表(一)_职场_14  while(j = phb[i].cur)
静态链表(一)_职场_14  {
静态链表(一)_职场_14    printf("%d name: %s\n",j,phb[j].data.name);
静态链表(一)_职场_14    printf("%d num: %s\n",j,phb[j].data.num);
静态链表(一)_职场_14    i = j;
静态链表(一)_职场_14  }
静态链表(一)_职场_14}