本篇内容主要讲解“C语言怎么实现单链表的基本功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言怎么实现单链表的基本功能”吧!
首先简单了解一下链表的概念:
要注意的是链表是一个结构体实现的一种线性表,它只能从前往后,不可以从后往前(因为next只保存下一个节点的地址).在实现单链表的操作时,需要用指针来操作.很简单,注释写的很详细,欢迎大家指正哈哈哈哈~之前写的太烂了重新写了一下.....
代码展示:
#include <stdio.h>#include <assert.h>#include <stdlib.h>typedef struct linklist {int data;struct linklist* next;}node;//目录//1.动态申请节点node* Creatnode(int x);//2.单链表的尾插void PushBack(node** plist, int x);//3.单链表的打印void Printlist(node** plist);//4.单链表尾删void Popback(node** plist);//5.单链表的头插void PushFront(node** plist, int x);//6.单链表的头删void PopFrount(node** plist);//7.单链表的查找node* Findpos(node* plist, int x);//8.单链表在pos位置之后插入xvoid Insertlinstafter(node* pos, int x);//9.单链表删除pos位置之后的元素void PopPosAfter(node* pos);//10.单链表的销毁void Destorylist(node** plist);//1.动态申请节点node* Creatnode(int x) {node* t = (node*)malloc(sizeof(node));if (t == NULL) {assert(0);return NULL;}else {t->next = NULL;t->data = x;return t;}}//2.单链表的尾插void PushBack(node** plist, int x) {assert(plist);if (*plist == NULL) {*plist = Creatnode(x);}else {node* p = *plist;while (p->next) {p = p->next;}p->next = Creatnode(x);}}//3.单链表的打印void Printlist(node** plist) {assert(plist);node* p =* plist;while (p) {printf("%d ", p->data);p = p->next;}}//4.单链表尾删void Popback(node** plist) {assert(plist);if (*plist == NULL) {return NULL;}node* p = *plist;node* q = NULL;while (p->next) {q = p;p = p->next;}q->next =NULL;free(p);}//5.单链表的头插void PushFront(node** plist, int x) {assert(plist);node* t = Creatnode(x);if (NULL == *plist) {*plist = t;}else {t->next = *plist;*plist = t;}}//6.单链表的头删void PopFrount(node** plist) {assert(plist);if (plist == NULL) {return NULL;}else {node* p = *plist;*plist = p->next;free(p);}}//7.单链表的查找node* Findpos(node* plist, int x) {node* cur = plist;while (cur) {if (cur->data == x) {return cur;}cur = cur->next;}return NULL;}//8.单链表在pos位置之后插入xvoid Insertlinstafter(node* pos, int x) {assert(pos);if (NULL == pos) {return ;}node* t = Creatnode(x);t->next = pos->next;pos->next = t;}//9.单链表删除pos位置之后的元素void PopPosAfter(node* pos) {assert(pos);if (pos->next == NULL) {return;}else{node* p = pos->next;pos->next = p->next;free(p);}}//10.单链表的销毁void Destorylist(node** plist) {assert(plist);node* p = *plist;while (p) {*plist = p->next;free(p);p = *plist;}*plist = NULL;} void test1() {node* plist=NULL;//创建头指针PushBack(&plist, 1);//尾插元素PushBack(&plist, 2);PushBack(&plist, 3);PushBack(&plist, 4);PushBack(&plist, 5);Printlist(&plist);//打印链表元素 1 2 3 4 5 printf("\n");Popback(&plist); //尾删元素 PushFront(&plist, 0);//首插元素0 Printlist(&plist);//打印链表 0 1 2 3 4printf("\n");PopFrount(&plist);//首删元素0 Printlist(&plist);//打印链表 1 2 3 4printf("\n");Findpos(plist,1);//寻找链表中1的地址,不方便演示,下面会演示Insertlinstafter(Findpos(plist, 4), 5);//在4后面插入5,用到上面的Findpos函数Printlist(&plist);//打印链表 1 2 3 4 5printf("\n");PopPosAfter(Findpos(plist, 4));//删除指定位置后面的元素(删除4后面的5)Printlist(&plist);//打印链表 1 2 3 4printf("\n");Destorylist(&plist);//销毁链表Printlist(&plist);//打印链表}void test() {test1();}int main() {test();return 0;}
测试结果:
a.先创建了头指针plist
b.尾插1 2 3 4 5
c. 尾删元素5
d.首插元素0
e.首删元素0
f.在元素4 后面插入5
g.删除4元素后面的5
h.销毁链表
到此,相信大家对“C语言怎么实现单链表的基本功能”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!