单链表是数据结构中最基本的数据结构,单链表有头插法和尾插法,今天有空把这两者做成一个实验示例以作比较。
提示:编译代码是否通过可能与编译器的版本有关,本程序是在 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