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

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

 

  提示:编译代码是否通过可能与编译器的版本有关,本程序是在 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 {
 
        
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冰雪青松

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

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

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

打赏作者

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

抵扣说明:

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

余额充值