C语言的链表创建与逆置解析
1.创建动态链表
建立动态链表是指在程序执行中从无到有地建立一个链表,即一个一个地创建结点、赋值,并建立起前后相继的关系。
需要:指针、结构体、malloc函数
思想:定义三个预先定义的结构体类型指针变量 (List_head、temp、p),动态创建一个节点,并使List_head、temp指针指向它,将此结点的next置为NULL,作为循环建立结点的条件(temp->next != NULL)。再创建一个新的结点并赋值,将其next置为NULL,将temp指向此结点。以此循环,创建链表。(每次判断当前结点后继是否为空,指向创建的新结点,创建新结点之后,将该新结点的后继置空)
代码实现:
//创建链表
LinkList create_list()
{
DataType value[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int len = sizeof(value) / sizeof(DataType);
int i = 0;
LinkedNode *list_head = NULL;
LinkedNode *temp = NULL;
LinkedNode *p = NULL;
list_head = (LinkedNode*)malloc(sizeof(LinkedNode));
list_head->data = value[0];
list_head->next = NULL;
temp = list_head;
for(i = 1; i < len; i++)
{
while (temp->next != NULL)
{
temp = temp->next;
}
p = (LinkedNode*)malloc(sizeof(LinkedNode));
p->data = value[i];
p->next = NULL;
temp->next = p;
}
return list_head;
}
2.链表逆置
思想:就地逆置。创建三个结构体指针变量,依次指向第1,2,3个结点位置。
代码实现:
void reverse_list(LinkList list)
{
LinkedNode *pre = list;
LinkedNode *cur = list->next;
LinkedNode *next = NULL;
if(list == NULL || list->next == NULL)
return;
/*在这里实现翻转*/
while(cur != NULL)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
list->next = NULL;
list = pre;
print(list);
return;
}
整体调试源码:
#include <stdio.h>
#include <malloc.h>
typedef int DataType;
typedef struct node
{
DataType data;
struct node *next;
}LinkedNode, *LinkList;
//创建链表
LinkList create_list()
{
DataType value[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int len = sizeof(value) / sizeof(DataType);
int i = 0;
LinkedNode *list_head = NULL;
LinkedNode *temp = NULL;
LinkedNode *p = NULL;
list_head = (LinkedNode*)malloc(sizeof(LinkedNode));
list_head->data = value[0];
list_head->next = NULL;
temp = list_head;
for(i = 1; i < len; i++)
{
while (temp->next != NULL)
{
temp = temp->next;
}
p = (LinkedNode*)malloc(sizeof(LinkedNode));
p->data = value[i];
p->next = NULL;
temp->next = p;
}
return list_head;
}
/*打印链表中的各个节点*/
void print(LinkList list)
{
LinkedNode *temp = NULL;
if(list == NULL)
return;
temp = list;
while(temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
return;
}
void reverse_list(LinkList list)
{
LinkedNode *pre = list;
LinkedNode *cur = list->next;
LinkedNode *next = NULL;
if(list == NULL || list->next == NULL)
return;
/*在这里实现翻转*/
while(cur != NULL)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
list->next = NULL;
list = pre;
print(list);
return;
}
int main()
{
LinkList list = NULL;
list = create_list();
print(list);
reverse_list(list);
return 0;
}