- 题目:构造一个单链表。
- 使用的软件:VS2022
- 使用的语言:C语言
- 使用的项目:test.c
Setlist.h
Setlish.c
- 项目实践: Setlist.h的代码为:
#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> //定义节点的结构 //数据 + 指向下一个节点的指针 typedef int SLTDataType; typedef struct SListNode { SLTDataType data; struct SListNode* next; }SLTNode; void SLTPrint(SLTNode* phead); //尾插 void SLTPushBack(SLTNode** pphead, SLTDataType x); //头插 void SLTPushFront(SLTNode** pphead, SLTDataType x); //尾删 void SLTPopBack(SLTNode** pphead); //头删 void SLTPopFront(SLTNode** pphead);
它和顺序表的头文件基本上差不多,
-
Setlish.c的主文件,则代码为:
#define _CRT_SECURE_NO_WARNINGS 1 #include"SList.h" void SLTPrint(SLTNode* phead) { SLTNode* pcur = phead; while (pcur)//pcur != NULL { printf("%d->", pcur->data); pcur = pcur->next; } printf("NULL\n"); } SLTNode* SLTBuyNode(SLTDataType x) { SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); if (newnode == NULL) { perror("malloc fail!"); exit(1); } newnode->data = x; newnode->next = NULL; return newnode; } //尾插 void SLTPushBack(SLTNode** pphead, SLTDataType x) { assert(pphead); //*pphead 就是指向第一个节点的指针 //空链表和非空链表 SLTNode* newnode = SLTBuyNode(x); if (*pphead == NULL) { *pphead = newnode; } else { //找尾 SLTNode* ptail = *pphead; while (ptail->next) { ptail = ptail->next; } //ptail指向的就是尾结点 ptail->next = newnode; } } //头插 void SLTPushFront(SLTNode** pphead, SLTDataType x) { assert(pphead); SLTNode* newnode = SLTBuyNode(x); //newnode *pphead newnode->next = *pphead; *pphead = newnode; } //尾删 void SLTPopBack(SLTNode** pphead) { //链表不能为空 assert(pphead && *pphead); //链表只有一个节点 if ((*pphead)->next == NULL) //-> 优先级高于* { free(*pphead); *pphead = NULL; } else { //链表有多个节点 SLTNode* prev = *pphead; SLTNode* ptail = *pphead; while (ptail->next) { prev = ptail; ptail = ptail->next; } //prev ptail free(ptail); ptail = NULL; prev->next = NULL; } } //头删 void SLTPopFront(SLTNode** pphead);
这里就直接写完了,不做过多的解释,请看vcr。
-
test.c的代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include"SList.h" void SListTest01() { //链表是由一个一个的节点组成 //创建几个节点 SLTNode* node1 = (SLTNode*)malloc(sizeof(SLTNode)); node1->data = 1; SLTNode* node2 = (SLTNode*)malloc(sizeof(SLTNode)); node2->data = 2; SLTNode* node3 = (SLTNode*)malloc(sizeof(SLTNode)); node3->data = 3; SLTNode* node4 = (SLTNode*)malloc(sizeof(SLTNode)); node4->data = 4; //将四个节点连接起来 node1->next = node2; node2->next = node3; node3->next = node4; node4->next = NULL; //调用链表的打印 SLTNode* plist = node1; SLTPrint(plist); } void SListTest02() { SLTNode* plist = NULL; SLTPushBack(&plist, 1); SLTPushBack(&plist, 2); SLTPushBack(&plist, 3); SLTPushBack(&plist, 4); SLTPrint(plist); //SLTPushBack(NULL, 5); // //测试头插 //SLTPushFront(&plist, 6); //SLTPrint(plist); //SLTPushFront(&plist, 7); //SLTPrint(plist); //SLTPushFront(&plist, 8); //SLTPrint(plist); //测试尾删 SLTPopBack(&plist); SLTPrint(plist); SLTPopBack(&plist); SLTPrint(plist); SLTPopBack(&plist); SLTPrint(plist); SLTPopBack(&plist); SLTPrint(plist); } int main() { //SListTest01(); SListTest02(); return 0; }
基本上就这么多,如果要解释,就是越解释越乱,请大家仔细观看。