不带头结点的单链表的建立

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct LinkList_
{
	int data;
	struct LinkList_ *next;
}LinkList;

void create_list(LinkList **list)
{
	int data;
	LinkList *new_node;

	data = getchar();
	if(data != '#');
	if( NULL == (*list = (LinkList *)malloc(sizeof(LinkList))) )
		exit(-1);
	(*list)->data = data - '0';
	(*list)->next = NULL;

	while((data = getchar()) != '#')
	{
		if( NULL == (new_node = (LinkList *)malloc(sizeof(LinkList))) )
			exit(-1);

		new_node->data = data - '0';
		new_node->next = (*list)->next;
		(*list)->next = new_node;
	}
	
}

int main()
{
	LinkList *list;

	create_list(&list);

	free(list);

	return 0;
}


带头结点单链表建立方法主要有头插法和尾插法。 ### 头插法 头插法的核心思想是每次插入新节点时,将新节点的`next`指针指向当前链表的头节点,然后更新链表的头指针,使其指向新节点,这样新节点就成为了链表的第一个节点,插入操作的时间复杂度为$O(1)$。以下是头插法的代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表结点类型 typedef struct LNode { int data; // 每个节点存放一个数据元素 struct LNode *next; // 指针指向下一个节点 } LNode, *LinkList; // 头插法插入新节点 int headInsert(LinkList* L, int value) { LinkList s = (LinkList)malloc(sizeof(LNode)); if (s == NULL) { printf("内存分配失败!\n"); return -2; } s->data = value; s->next = *L; *L = s; // 更新头结点指向新结点 return 0; // 插入成功 } // 头插法建立带头结点单链表 LinkList createListByHeadInsert(int values[], int n) { LinkList L = NULL; for (int i = 0; i < n; i++) { headInsert(&L, values[i]); } return L; } ``` ### 尾插法 尾插法是将新节点插入到链表的尾部。需要一个指针始终指向链表的尾节点,每次插入新节点时,将尾节点的`next`指针指向新节点,然后更新尾指针指向新节点。以下是尾插法的代码示例: ```c // 尾插法建立带头结点单链表 LinkList createListByTailInsert(int values[], int n) { LinkList L = NULL, tail = NULL; for (int i = 0; i < n; i++) { LinkList s = (LinkList)malloc(sizeof(LNode)); if (s == NULL) { printf("内存分配失败!\n"); return NULL; } s->data = values[i]; s->next = NULL; if (L == NULL) { L = s; tail = s; } else { tail->next = s; tail = s; } } return L; } ``` ### 测试代码 ```c // 打印链表 void printList(LinkList L) { LinkList p = L; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { int values[] = {1, 2, 3, 4, 5}; int n = sizeof(values) / sizeof(values[0]); // 头插法建立链表 LinkList list1 = createListByHeadInsert(values, n); printf("头插法建立的链表: "); printList(list1); // 尾插法建立链表 LinkList list2 = createListByTailInsert(values, n); printf("尾插法建立的链表: "); printList(list2); return 0; } ``` ### 复杂度分析 - **头插法**:每次插入操作的时间复杂度为$O(1)$,建立长度为$n$的链表的时间复杂度为$O(n)$。 - **尾插法**:每次插入操作的时间复杂度为$O(1)$,建立长度为$n$的链表的时间复杂度为$O(n)$。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值