数据结构这门课是每个程序员都必须要熟悉掌握的一门课程,更何况绩点还是得要的
这门课讲的知识首先很多而且会用到c语言程序设计中较为复杂的东西,不及时再将实例亲自打一遍是不行的,此博客将总结数据结构中所讲的单链表最基本的增删改查的操作方法,以便于之后栈与队列的学习。
一. 什么是单链表?
单向链表(又名单链表、线性链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过从头部开始,依序往下读取。-----wikipedia
其特征就是首节点中data区域会被初始化为空,尾节点中所指向的地址会被初始化为NULL。
二. 单链表的用处
单链表的功能和顺序表相似,但在不同情况下算法的时间复杂度(描述了该算法的理论上执行的时间)上却大不相同。在查找修改数据或者读取数据的时候,顺序表占得优势很大,但是当遇到增删这种操作时,链表又会占据优势,原因是在增删的时候顺序表中增加或删除的元素后的所有元素都需要后退或前进一位来保证其顺序正确,而链表在构造上天生就不需要动后面的元素,仅需要修改一下周围一个或两个节点的指针即可完成增删操作,大大减少了cpu进行运算的时间。
三. 单链表的基本操作
1.创建单链表
创建单链表有两种常见的方式:头插法(头结点不断连接新节点)和尾插法(直接在原链表后面添加节点)
注意:头插法会造成输入的元素与输出的元素顺序相反(类似栈的操作),而尾插法所创造的链表则是按正常顺序输入输出。
1.1 头插法
//需要传递的参数为需要创建的节点数
void Createlist_Head(LinkList &L,int n)
{
LNode *p;
int i = 0;
L = (LinkList)malloc(sizeof(LNode));// 创建头节点
L->next = NULL; //建立空链表
for(i = n;i>0;--i)
{
p = (LinkList)malloc(sizeof(LNode));//外加空节点
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
//头插法
}
1.2 尾插法
//需要传递的参数为需要创建的节点数
void Createlist_Tail(LinkList &L,int n)
{
LNode *p,*q;
int i = 0;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
q = L;
for(i;i<n;i++)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
q->next = p;
q = p;
}
// 尾插法
p->next = NULL;//尾节点指针为空
}
2.单链表的增加(插入)
//插入节点
int Insert(LinkList &L,int n,int m)
{
LNode *p = NULL,*q = NULL;
int i = 0;
p = L;
while(p->next!=NULL&&i<n-1)
{
p = p->next;
i++;
}
if(i=n-1)
{
q = (LinkList)malloc(sizeof(LNode));
q->data = m;
q->next = p->next;
p->next = q;
}
return OK;//使用时先在开始定义1为OK
}
3.单链表节点的删除
//删除节点
//传递参数为原链表和需要被删除的节点位置
int Delete(LinkList &L,int n)
{
LNode *p,*q;
p = L;
int i = 0;//用来定位p现在的位置 并与传参n进行对比
while(p->next!=NULL&&i<n)//
{
i++;//首先查找节点位置右移
if(i == n)
//当查找参数位置移动到需要被删除的节点时
{
//q在被删除的节点的前一个节点位置
q = p->next;//q赋值为需要被删除的节点位置
p->next = q->next;//p指向被删除节点的下一个节点
free(q);//删除节点
}
p = p->next;//当i不等于n时右移并循环
}
return OK;
}
4. 单链表指定位置的数据查询
//查询数据
//传递的int类型的参数为需要被查询的数据位置
int Getelem(LinkList L,int n)
{
LNode *p;//定义一个指针
p = L;//初始化指针
int i = 0;//记录指针位置
//定义
while(p->next->data != n&&p->next!=NULL)
{
p = p->next;
i++;
}
if(p->next->data == n)//检测其数据为被返回的数据
printf("\n%d\n\n\n",i);
return OK;
}
5.输出数据
//输出数据
void PrintElem(LinkList L)
{
LinkList p = L->next;//初始化为第一个节点
while(p)//当指针指向部分不为零时
{
printf("%5d",p->data);//输出其数据
p = p->next;//移动指针
}
}
接下来只要写一个主函数传递参数进行调用即可。