链表的常见实现
来源:互联网 发布:逆袭网络剧7第一集哇趣 编辑:程序博客网 时间:2024/05/24 05:46
链表结点声明如下:
- struct LinkList {
- int value;
- LinkList *next;
- };
以下是不带头结点的单链表的操作。
1. 根据输入建立单链表
将输入的节点插入到链表头部。
-
- LinkList *BuildList() {
- LinkList *head = NULL;
- int data;
- int i = 0;
- while (scanf("%d", &data) != EOF) {
-
- LinkList *new_node = (LinkList *)malloc(sizeof(LinkList));
- if (NULL == new_node) {
- fprintf(stderr, "malloc failed");
- return head;
- }
- new_node->value = data;
- if (head == NULL) {
- new_node->next = NULL;
- head = new_node;
- }
- else {
- new_node->next = head;
- head = new_node;
- }
- }
- return head;
- }
2. 链表插入操作
链表插入时注意当链表为空的情况。
(1)在链表头插入
-
- LinkList *InsertToHead(int value, LinkList *head) {
- LinkList *new_node = (LinkList *)malloc(sizeof(LinkList));
- if (new_node == NULL) {
- fprintf(stderr, "malloc failed");
- return head;
- }
- new_node->value = value;
- new_node->next = NULL;
- if (head == NULL) {
- head = new_node;
- }
- else {
- new_node->next = head;
- head = new_node;
- }
- return head;
- }
(2)在链表尾部插入
-
- LinkList *InsertToTail(int value, LinkList *head) {
- LinkList *new_node = (LinkList *)malloc(sizeof(LinkList));
- if (new_node == NULL) {
- fprintf(stderr, "malloc failed");
- return head;
- }
- new_node->value = value;
- new_node->next = NULL;
-
- if (head == NULL)
- head = new_node;
- else {
- LinkList *pnode = head;
- while (pnode->next != NULL)
- pnode = pnode->next;
- pnode->next = new_node;
- }
- return head;
- }
3. 链表的删除操作
注意当链表仅有一个节点时的删除。
-
- LinkList *DeletebyValue(int value, LinkList* head) {
- if (head == NULL)
- return head;
- LinkList *pToDelete = NULL;
- if (head->value == value) {
- pToDelete = head;
- head = head->next;
- }
- else {
- LinkList *p = head;
- while (p->next != NULL && p->next->value != value)
- p = p->next;
- if (p->next != NULL) {
- pToDelete = p->next;
- p->next = pToDelete->next;
- }
- }
- if (pToDelete != NULL) {
- free(pToDelete);
- pToDelete = NULL;
- }
- return head;
- }
4. 求单链表中结点的个数
注意检查链表是否为空。时间复杂度为O(n)。该操作不用特意检查链表是否为空,如下代码,链表为空会返回0。
- unsigned int Length(LinkList *head) {
- unsigned int length = 0;
- LinkList *p = head;
- while (p) {
- ++length;
- p = p->next;
- }
- return length;
- }
5. 打印链表元素
(1)正向打印链表
-
- void PrintList(LinkList *head) {
- LinkList *p = head;
- while (p) {
- printf("%d ", p->value);
- p = p->next; <li class="alt" style="border-t