linklist.h
#pragma once
#include"stdlib.h"
typedef struct LinkNode
{
//数据域
char* data;
//指针域
struct LinkNode* next;
}LinkNode,linklist;
//初始化
LinkNode linklistInit();
//打印链表
void linklistPrint(LinkNode *head);
//尾插
LinkNodelinklistPushBack(LinkNode head, char* value);
//尾删
void linklistPopBack(LinkNode *head);
//销毁节点
void DestroyNode(LinkNode *node);
linklist.c
#include<stdio.h>
#include<stdlib.h>
#include"linklist.h"
LinkNode* linklistInit()
{
LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode));
head->data = NULL;
head->next = NULL;
return head;
}
LinkNode* createnode(char* p)
{
if (p == NULL){ return NULL; }
LinkNode* tmpnode = (LinkNode*)malloc(sizeof(LinkNode));
tmpnode->data = p;
tmpnode->next = NULL;
return tmpnode;
}
void DestroyNode(LinkNode *node)
{
free(node);
}
void linklistPrint(LinkNode *head)
{
if (head == NULL)
{
return;
}
;
while (head != NULL)
{
printf("%s\n",head->data);
head = head->next;
}
}
//尾端插入
LinkNode linklistPushBack(LinkNode head, char value)
{
if (head == NULL){ return NULL;}
LinkNode tmpnode = createnode(value);
while (head->next!= NULL)
{
head = head->next;
}
head->next = tmpnode;
return tmpnode;
}
//尾端删除
void linklistPopBack(LinkNode *head)
{
if (head == NULL)
{
return;
}
if (head->next == NULL){
return;
}
else{
while (head->next ->next!= NULL)
{
head = head->next;
}
LinkNode* deletenode = head->next;
DestroyNode(deletenode);
head->next = NULL;
}
}
maintest.c
#include"stdlib.h"
#include"linklist.h"
void main(){
linklist list = linklistInit();
linklistPushBack(list, “wowowowow”);
linklistPushBack(list,“bbbbbb”);
linklistPrint(list);
linklistPopBack(list);
linklistPopBack(list);
linklistPrint(list);
system(“pause”);
}
具体原因可以参照我的上一篇文章的分析,网上大部分的观点都是单链表用二级指针实现的,我也是纠结了很久搞不懂为什么偏要二级指针,其实一级指针也能实现。