单链表的头插法和尾插法的示例

本文介绍了单链表这一基础数据结构,并通过实例展示了头插法和尾插法创建单链表的过程。在Android操作系统下的C语言编译器环境下,程序成功编译并通过了简单的增、查操作。结构体定义中,data字段通常用于存储复杂数据,例如姓名、性别、年龄等信息。
摘要由CSDN通过智能技术生成

  单链表是数据结构中最基本的数据结构,单链表有头插法和尾插法,今天有空把这两者做成一个实验示例以作比较。

 

  提示:编译代码是否通过可能与编译器的版本有关,本程序是在 Android 操作系统下的 Compiler C语言编译器下编译通过。

 

  一、头插法和尾插法创建单链表

  增、删、改、查的算法只写了增、查两个,其它省略。

/*
  程序功能:单链表的头插法和尾插法实验示例
  说明:本程序的增删改查功能部分实现
  作者:九天一声啸
  邮箱:946585434@qq.com
  日期:2022.09.09
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<stdbool.h>
#include<assert.h>

#define BOOL  int
#define TRUE  1
#define OK    1
#define FALSE 0
#define NO    0
#define ERROR -1
 
//链表长度
 
int length = 16;
 
//TRUE 为自然数列,FALSE 为随机数
bool choose = true;
//bool choose = false;
 
//定义结构体
typedef struct Node 
{
    int data;
    struct Node *next;
    
}Node, *LinkList;
 
LinkList head = NULL;
LinkList end = NULL; //尾插法时使用的结构体指针
 
//头插法函数
void addHead(int data)
{
    LinkList L;
    L = (LinkList)malloc(sizeof(Node));
    L->data = data;
    L->next = head->next;
    head->next = L;
    
}
 
//尾插法函数
void addEnd(int data) {
 
    LinkList L;
    L = (LinkList)malloc(sizeof(Node));
    L->next = NULL;
    L->data = data;
 
    if(NULL == head)
    {
        head = L;
    } else {
        end->next = L;
    }
 
    end = L;
    
}
 
//头插法遍历链表并输出
void showListHead()
{
 
    LinkList tmp;
    tmp = head->next;
 
    while (tmp != NULL)
    {
        printf ("%d ", tmp->data);
        tmp = tmp->next;
    }
    
}
 
//尾插法遍历链表并输出
void showListEnd()
{
 
    LinkList tmp;
    tmp = head;
 
    while(tmp)
    {
        printf("%d ", tmp->data);
        tmp = tmp->next;
    }
    
}
 
int main()
{
 
    int i;
    char str[10];
    BOOL tag;
    srand(time(0));
 
    printf("请输入内容,true 是尾插法;false 是头插法:\n\t->");
    scanf("%s",&str);
 
    /*
      判断输入内容
    
      tag = 1  为true;
      tag = 0  为false
      tag = -1 为error
    */
    if(strcmp(str, "true") == 0)
        tag = TRUE;
    else if(strcmp(str, "false") == 0)
        tag = FALSE;
    else
        tag = ERROR;
 
    if(tag == TRUE) {
 
        //头插法需要这段代码,否则错误
        head = (LinkList)malloc(sizeof(Node));
        head->next = NULL;
 
        //头插法插入数据
        for(i = 0; i < length; i++)
        {
            if(choose == true)
                addHead(i);
            else
                //随机数
                addHead(rand()%100 + 1);
        }
 
        printf("头插法:\n");
 
        //头插法显示
        showListHead();
 
    } else if(tag == FALSE) {
 
        //尾插法插入数据
        for(i = 0; i < length; i++)
        {
            if(choose == true)
                addEnd(i);
            else
                //随机数
                addEnd(rand()%100 + 1);
        }
 
        printf("尾插法:\n");
 
        //尾插法显示
        showListEnd();
 
    } else {
 
        prin
C语言中,我们可以使用结构体表示链表节点,并通过指针进行头插法(即在列表头部插入节点)和尾插法(在列表尾部插入节点)。以下是这两种方法的基本示例: ### 头插法 ```c #include <stdio.h> typedef struct Node { int data; struct Node* next; } Node; // 创建新的节点 Node* newNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode; } // 头部插入 void insertAtHead(Node** head, int data) { Node* newNode = newNode(data); newNode->next = *head; *head = newNode; } // 示例 void printList(Node* head) { while (head != NULL) { printf("%d ", head->data); head = head->next; } printf("\n"); } int main() { Node* head = NULL; insertAtHead(&head, 1); insertAtHead(&head, 2); insertAtHead(&head, 3); printList(head); // 输出:3 2 1 return 0; } ``` ### 尾插法 ```c // 尾部插入 void insertAtTail(Node** head, int data) { Node* newNode = newNode(data); if (*head == NULL) { *head = newNode; return; } Node* temp = *head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } int main() { Node* head = NULL; insertAtTail(&head, 1); insertAtTail(&head, 2); insertAtTail(&head, 3); printList(head); // 输出:1 2 3 return 0; } ``` 在这两个示例中,我们首先定义了一个`Node`结构体,然后分别实现了头插法尾插法的函数。注意,在实际项目中,为了防止内存泄漏,`malloc`返回的指针应该始终被`free`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰雪青松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值