用C语言创建一个链表数据结构
链表是一种数据结构,对于要学习数据结构的人学习好链表是非常重要的。
一个链表需要包含什么呢,我的理解就是:1、有n个节点离散分配,2、每个节点通过指针来连接,3、每个节点都有一个前驱节点和一个后驱节点,4、首节点没有前驱节点,尾节点没有后驱节点。
一、节点的构造
typedef struct Nod { int data;//存放数据的域 struct Node *pNext; //定义一个结构体指针,指向下一个数据类型相同的节点 }NODE,*PNODE; //NODE等价于 struct Node; PNODE等价于struct Node *; 此处用大写是为了与变量区分,可以让人容易变出是个数据类型
typedef 只是给数据类型取个别名,即 typedef 数据类型 别名;我们知道struct Node 是我们定义的数据类型;
(2)链表的创建
在创建链表之前,我们需要需要了解一下专业术语:
首节点:存放第一个有效数据的节点;
尾节点:存放最后一个有效数据的节点;
头节点:头节点的数据类型与首节点的数据类型相同,并且头节点是首节点前面的那个节点,并不存放有效数据;头节点的存在只是为了方便链表的操作。
头指针:指向头节点的指针;
尾指针:指向尾节点的指针;
二、在头节点后面插入一个节点
PNODE Create_Lise(void){ int len;//存放链表的长度 int i;//循环变量 int val;//用来临时存放变量 PNODE Lise; PNODE pHead=(PNODE) malloc(sizeof(NODE));//分配一个节点 if(pHead==NULL){ printf("请输入链表的值"); exit(-1); }else{ PNODE pTail=pHead; pHead->pNext=null; printf("需要一个指针指向结尾"); scanf("%d",&len); for(i=o;i<len;i++){ PNODE p=(PNODE)malloc(sizeof(NODE)); if(null=p){ printf("插入了"); exit(-1); } else{ printf("我在最后插入"); scanf("%d",&val); p->data=val; pTail->pNext=p; p->pNext=null; pTail=p; } } } }
三、向链表插入元素
//链表的第pos有效元素前面插入元素val,首先我们应该找到第pos个元素前面一个元素的位置; //当链表有3个元素时,pos=4,将不会进行插入操作 bool Insert_List(PNODE pHead,int pos,int val){ int i=0; PNODE p=pHead; while((Null!=p)&&(i<pos-1)){ p=p->pNext; i++ } if(p==null||i>pos-1)//把链表为空的情况考虑进去了;i>pos-1可以防止用户输入错误; return false; //程序执行到这之后,i=pos-1;p指针指向链表第pos个有效节点前驱,即指向第pos-1节点; PNODE q=(PNODE)malloc(sizeof(NODE)); q->data=val; q->pNext=p->pNext; p->pNext=q; }
四、删除链表中的元素
bool Delete_Lise(PNODE pHead,int pos,int *var){ int i=0; PNODE p=pHead; while((NULL!=p)&&(i<pos-1)){ p=p->pNext; i++; } if(p==null||i>pos-1) //把链表表为空的情况去了 return false; //程序执行到这后,i=pos-1; PNODE q=p->pNext;//q指向待删除的节点 *val=q->data; p->pNext=q->pNext;//修改链表的指向 free(q); //释放q所指向节点的内存 q=NULL; //如果不清空,会出现野指针 }
五来来来冒泡排序一下
void Sort_List(PNODE pHead){ int i,j; int temp; int len=length_List(pHead); PNODE p,q; for(i=0,p-pHeda->pNext;i<len-1;i++,p->pNext){ for(j=i+1,q=p->pNext;i<len;j++,q=q->pNext){ //交换数据 if(p->data>q->data){ temp=p->data; p->data=q->data; q->data=temp; } } } }
原文地址:https://www.jianshu.com/p/ccebe9fd66c6
相关推荐
-
C++中关于引用与指针 c/c++
2019-3-29
-
Binder机制情景分析之linux环境适配 c/c++
2019-3-29
-
C++ 线程安全的单例模式总结 c/c++
2019-9-1
-
怎样削减C++代码间依赖 c/c++
2019-4-1
-
时钟设置函数的过程梳理及编写 c/c++
2019-9-11
-
C++ vector 使用注意事项 c/c++
2019-8-16
-
流控算法探讨——之计数器模型原理及实现 c/c++
2019-3-28
-
全新通用编程语言 Def 招募核心贡献者、文档作者、布道师 deflang.org c/c++
2019-3-29
-
大小端 c/c++
2019-3-29
-
基于c++11的event-driven library。 c/c++
2020-6-15