创建头结点
流程:首先创建头结点表指针并为其分配空间——并将头结点指向空,防止出现段错误。
代码:
//创建头结点
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;
}
头结点的好处就在于他不用考虑空表的情况,详细的注释之前的博客有,这边我就省略了。