C语言-链表的创建头插法和尾插法(有无头节点)

结构声明

typedef int ElementType;

typedef struct Node {
	ElementType data;
	struct Node *Next;
} *List;

1 头插法(有头节点)

/* 
	建立链表 - 头插法 - 有头节点 

	+------+	     +------+	 +------+	 +------+
	| head |   =>    |node_1| -> |node_2| -> |node_3| -> NULL
	+------+	     +------+	 +------+	 +------+
	      \			  /
		     +------+
		     |   p  |
		     +------+

*/
List HeadCreate(void)
{
	ElementType x; // 保存 Node 中的 data 数据
	List p; // 临时指针,用于保存声明的节点
	List head; // 整个链表的头结点;
	head = (List)malloc(sizeof(struct Node));
	head->Next = NULL;
	head->data = 0; // 头节点的 data 域用于保存链表的长度
	scanf("%d", &x);

	while (x != -1) { // 当 x 等于 -1 的时候,停止创建链表
		p = (List)malloc(sizeof(struct Node));
		p->data = x;
		p->Next = head->Next;
		head->Next = p;
		head->data++; // 链表的长度加 1
		
		scanf("%d", &x); // 读取下一个节点的数据
	}
	return head;
}

2 头插法(无头节点)

/*
	建立链表 - 头插法 - 没有头节点

	 		  +------+	  +------+	   +------+	   +------+
			  | head | -> |node_1| ->  |node_2| -> |node_3| -> NULL
	   ^  	  +------+	  +------+	   +------+	   +------+
       |
	+------+
	|  p   |
	+------+

*/
List HeadCreate(void)
{
	ElementType x; // 保存 Node 中的 data 数据
	List p;
	List head;
	head = NULL;
	scanf("%d", &x);

	while (x != -1) {
		p = (List)malloc(sizeof(struct Node));
		p->data = x;
		if (head == NULL) {	// 若第一次创建节点,则将该点设置为头节点
			head = p;
			p->Next = NULL;
		} else { // 若不是第一次创建节点,则直接将新节点接到链表头
			p->Next = head;
			head = p;
		}
		scanf("%d", &x);
	}
	return head;
}

3 尾插法(有头节点)

/* 
	创建链表 - 尾插法 - 有头节点

	+------+	+------+	+------+
	| head | -> |node_1| -> |node_2|   ____
	+------+	+------+	+------+	  |
										  v
						+------+ 	  +------+
						| rear |  ->  |   p  |
						+------+	  +------+

*/
List TailCreate(void)
{
	ElementType x; // 保存 Node 中的 data 数据
	List p;
	List head; // 头结点
	List rear; // 因为尾插法需要在尾部插入,所以要有个指针来保存尾的位置
	head = (List)malloc(sizeof(struct Node));
	head->Next = NULL;
	rear = head; // 链表为空,头和尾指向同一个位置
	scanf("%d", &x);

	while (x != -1) {
		p = (List)malloc(sizeof(struct Node));
		p->data = x;
		rear->Next = p;
		rear = p;
	}
	rear->Next = NULL; // 链表建立结束后将最后一个节点指向 NULL
	return head;
}

4 尾插法(无头节点)

/* 
	创建链表 - 尾插法 - 没有头节点 

	+------+	+------+	+------+
	|node_1| -> |node_2| -> |node_3| 	____
	+------+	+------+	+------+	   |
										   v
							+------+	+------+
							| rear | ->	|   p  |
							+------+	+------+

*/
List TailCreate(void)
{
	ElementType  x;
	List p;
	List head;
	List rear;
	head = NULL;
	rear = NULL;
	scanf(%d, &x);

	while (x != -1) {
		p = (List)malloc(sizeof(struct Node));
		p->data = x;
		if (head == NULL) { // 创建链表的第一个节点
			head = p;
			rear = p;
			p->Next = NULL;
		} else {
			rear->Next = p;
			rear = p;
		}
		scanf("%d", &x);
	}
	rear->Next = NULL; // 链表建立结束后将最后一个节点指向 NULL(尾插法中不要遗漏)
	return head;
}
C语言中,链表是一种动态数据结构,常用于存储一系列元素,不需要预先确定其大小。头插法(insert at head)和尾插法(insert at tail)是链表操作的基本方法。 1. **头插法(Insert at Head)**: - 函数原型通常可以这样定义:`void insertAtHead(struct Node* *head, int data)`,其中`struct Node* *head`是头节点指针的指针,`data`是要入的新值。 - 创建一个新的节点,并将其`next`字段设置为原来的头节点。 - 更新头节点指针指向新节点。 - 如果头节点本身就是新创建的,则不会改变原有链表。 2. **尾插法(Insert at Tail)**: - 函数原型类似:`void insertAtTail(struct Node* *head, int data)`。 - 步骤: - 创建新的节点并将它设为`NULL`,然后将新节点的`next`指针设置为当前最后一个节点。 - 如果链表为空(即头节点`*head`为`NULL`),则新节点同时作为头节点节点。 - 否则,遍历链表找到最后一个节点并更新它的`next`指针。 下面是一个简单的示例代码片段: ```c // 假设链表节点结构如下 typedef struct Node { int data; struct Node* next; } Node; // 头插法函数 void insertAtHead(Node** head, int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = *head; *head = newNode; } // 尾插法函数 void insertAtTail(Node** head, int data) { if (*head == NULL) { insertAtHead(head, data); } else { Node* current = *head; while (current->next != NULL) current = current->next; current->next = (Node*)malloc(sizeof(Node)); current->next->data = data; current->next->next = NULL; } }
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值