头插法创建单链表

根据用户输入的元素,按照头插的方式插入一个带头结点的链表,最后输出这个链表的内容;

注意:头插法创建时数据读入顺序与线性表中的逻辑顺序正好相反。即线性表(12,16,6,22),要想在链表中也维持这种顺序,则输入的顺序是22,6 16,12.

参考代码附上:

//单链表的基本操作
//创建并打印单链表 
#include<stdio.h>
#include<stdlib.h> 
typedef struct node
{
	int data;
	struct node *next;
}LNode,*LinkList;
 
 
 //头插创建 
LinkList CreatList(int n)
{
 	LinkList H=(LinkList)malloc(sizeof(LNode));
	H->next=NULL;
	LNode* s;
	int x;
	printf("请输入n个元素:"); 
	for(int i=0;i<n;i++){
		s=(LinkList)malloc(sizeof(LNode));
		scanf("%d",&x);
		s->data=x;
		s->next=H->next;
		H->next=s;
}
	  return H;
}
 
void PrintList(LinkList N)
{
	if(N==NULL)
		return; 
	 
	printf("%d ",N->data); 
	PrintList(N->next);
	
}
 int main()
{
	int n;
	printf("请输入要创建的元素个数:\n");
	scanf("%d",&n); 
 	LinkList list=CreatList(n);
 	printf("输出结果:");
 	PrintList(list->next); 
 	return 0;
}

***注意***

PrintList函数是从单链表的第二个结点开始的,这是因为此链表是带头节点的,头结点不存储据。如果不这样,就会出现如下情况:

把没用的头结点也打印出来了!

C语言中,我们可以使用头插法构建单链表并实现遍历、插入节点以及反转链表的操作。这里是一个简单的示例: 首先,我们定义一个结构体`Node`表示链表节点,包含数据域和指向下一个节点的指针: ```c typedef struct Node { int data; struct Node* next; } Node; ``` 接下来,我们创建链表的方法,包括初始化链表头插法插入节点: ```c // 初始化空链表 Node* createList() { return (Node*)malloc(sizeof(Node)); } // 插入节点到链表头部 void insertAtHead(Node** head, int data) { Node* newNode = createList(); newNode->data = data; newNode->next = *head; *head = newNode; } ``` 对于遍历链表,可以使用一个辅助函数`displayList`: ```c void displayList(Node* head) { Node* current = head; while (current != NULL) { printf("%d ", current->data); current = current->next; } printf("\n"); } ``` 要反转链表,我们需要两个指针,一个指向当前节点,另一个指向前一个节点: ```c Node* reverseList(Node* head) { Node* prev = NULL; Node* current = head; Node* next; while (current != NULL) { next = current->next; // 保存当前节点的下一个节点 current->next = prev; // 将当前节点的next指向前一个节点 prev = current; // 移动prev指针 current = next; // 移动current指针 } return prev; // 返回新的头节点 } ``` 结合以上代码,你可以通过以下方式创建链表、插入节点并进行操作: ```c int main() { Node* head = createList(); // 创建链表 // 插入节点示例 insertAtHead(&head, 5); // 链表: 5 -> NULL insertAtHead(&head, 4); // 链表: 4 -> 5 -> NULL insertAtHead(&head, 3); // 链表: 3 -> 4 -> 5 -> NULL // 遍历链表 displayList(head); // 输出: 3 4 5 // 反转链表 head = reverseList(head); // 翻转后的链表: 5 -> 4 -> 3 // 再次遍历显示反转后的链表 displayList(head); // 输出: 5 4 3 return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值