创建头结点
流程:首先创建头结点表指针并为其分配空间——并将头结点指向空,防止出现段错误。
代码:
//创建头结点
Node* Create_List ()
{
//创建头结点
Node* list = (Node*) malloc(sizeof(Node) / sizeof(char));
if (NULL == list) //检验创建是否成功
{
return FALSE;
}
list->next = NULL; //防止段错误
return list;
}
头插法
流程:判断数据传入是否正确——创建一个新结点并判断结点创建是否成功——给新结点成员变量赋值——让新结点变为链表的第一个结点
代码:
// 头插法
int Insert_Last (Node* h, LinkData data)
{
// 判断数据传入是否正确
if (NULL == h)
{
return FALSE;
}
// 创建新结点并判断创建是否成功
Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
if (NULL == node)
{
return FALSE;
}
// 给结点成员变量赋值
node->data = data;
node->next = h->next; // 和头指针的不同:node->next = *h;
// 让新结点变为链表的第一个节点
h->next = node;
return TRUE;
}
尾插法
流程:判断传入数据是否正确——创建一个新结点并为其分配空间,然后判断创建是否成功——给新结点成员变量赋值——找到最后一个结点并让其成为最后一个节点
代码:
//尾插
int Insert_Last(Node* h, LinkData data)
{
if (NULL == h)
{
return FALSE;
}
Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
if (NULL == node)
{
return FALSE;
}
node->data = data;
node->next = NULL;
Node* tmp = h;
while(tmp->next)
{
tmp = tmp->next;
}
tmp->next = node;
return TRUE;
}
中间插法(在pos处插入数据)
流程:判断传入数据和pos的位置是否符题意——找到插入位置的前一个结点,找到后要判断所找的位置是否越界——创建一个新结点并为其分配空间,然后判断创建是否成功——给新结点成员变量赋值——找到最后一个结点并让其成为最后一个结点。代码:
//中间插法
int Insert_Pos(Node *h, int pos, LinkData data)
{
if (NULL == h)
{
return FALSE;
}
Node* tmp = h;
int i;
for (i = 0; i < pos - 1; i++)
{
if (NULL == tmp)
{
break;
}
tmp = tmp->next;
}
if (NULL == tmp)
{
printf ("插入位置越界");
return FALSE;
}
Node* node = (Node*) malloc(sizeof(Node) / sizeof(char));
if (NULL == node)
{
return FALSE;
}
node->data = data;
node->next = tmp->next;
tmp->next = node;
return TRUE;
}
头结点的好处就在于他不用考虑空表的情况,详细的注释之前的博客有,这边我就省略了。