C语言数据结构-链表创建

1.结点结构

typedef int datatype;

typedef struct Node{

  datatype data;

  struct NODE *next;

}Node,*LinkList;

2.不带头结点的头插法

  每创建一个结点,都使该结点成为头结点,这样头结点不断地向前移动,就可以创建一个没有特定头结点的链表。

  首先创建的结点,会出现在整个链表的最末端,所以数据的写入是逆序的。

  注意:开始的时候,head要初始化为NULL

LinkList LinkListCreate(int n)
{
    int i;
    LinkList head;
    Node *p;
    head = NULL;
    for(;idata);
        p->next = head;
        head = p;
    }
}

3.不带头结点的尾插法创建链表

  指向头结点的指针不能移动,要创建一个一直指向尾结点的指针rear。

LinkList LinkListCreate(int n)
{
    int n= 0;
    LinkList head;
    Node *p,*rear;
    rear = head = NULL;
    for(;idata);

        if(NULL == head)
        else rear->next = p;

        rear = p;
    }
   rear->next = NULL;
}

注意:最后设置链表的结尾为NULL

4.头结点

头结点的数据域可以不存储任何信息,头结点的指针域存储指向第一个结点的指针(即第一个元素结点的存储位置)。头结点的作用是使所有链表(包括空表)的头指针非空,并使对单链表的插入、删除操作不需要区分是否为空表或是否在第一个位置进行,从而与其他位置的插入、删除操作一致。

5.带结点的头插法创建链表

 LinkList LinkListCreate(int n)
 {
     int i = 0;LinkList p;
     LinkList head = (Node*)malloc(sizeof(Node));
     head->next = NULL;
     
     for(;idata);
         p->next = head->next;
         head->next = p;
     }
      return head;
}

6.带结点的尾插法创建链表

LinkList LinkListCreate(int n)
{
    //开始创建的时候,rear = head.  rear->next = p; rear = p
    //最后要使的rear->next = NULL;

    int i = 0;Node *p,*rear;
    LinkList head = (Node*)malloc(sizeof(Node));
    rear = head;
    
    for(;idata);

        rear->next = p; 
        rear = p;
    }
    rear->next = NULL;

    return head;
}

7.头结点两个优点

(1)由于开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作就和在表的其它位置上

      的操作一致,无需进行特殊处理;

 (2)无论链表是否为空,其头指针是指向头结点在的非空指针(空表中头结点的指针域为空),因此空表和

     非空表的处理也就统一了。

基于上述两点优点,创建带头结点的链表会更好

 

 

 

 

 

 

 

你可能感兴趣的:(数据结构(C,语言))