数据结构
声明
诸多算法思想及代码源自王道数据结构,大学DS课程以及复习考研专业课涉及DS的同学,可以参照,写者水平有限,诸多错误欢迎同学们帮助查找!
829计算机专业基础
写者报考的是829计算机专业基础(专业课总分150,其中数据结构占比50分),三道算法题+2道编程题,每题十分。关于单链表操作这部分考的是编程题(10分)。
第一章 单链表
- 单链表的声明
typedef struct Lnode
{
int data;//数据域
struct Lnode *next;//指针域
}Lnode,*Linklist;
- 单链表的插入操作
单链表插入操作主要有两种方法:头插法和尾插法,每一种都非常重要!!!都要理解,在深入理解的基础上背诵默写!如果只是把代码死记下来是远远不够的,因为考试考的不是让你默写。 - 头插法
思想:从一个带有头结点的空表开始(头结点没有数据!)重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表头,直到读入结束标志为止。
图形帮助理解
不头结点的单链表如图:
带头结点的单链表如图:
注意带头结点的第一个结点无数据域!
头插法的每一步过程如图:
图是书上copy来的,静下心来理解很容易就会懂的,可以自己在草稿纸上多画几遍,实在不懂可以私信写者,看到我会回复的。
代码如下:
Linklist HeadInster(Linklist &L)
{
Lnode *p;
int x;//数据域
L=(Linklist)malloc(sizeof(Lnode));//建立单链表头指针
L->next=NULL;//头指针的下一个指针为空,即链表此时为空
scanf("%d",&x);//取值
while (x!=9999)//循环条件,9999只是个跳出循环的数字
{
p=(Lnode *)malloc(sizeof(Lnode));//建立新结点
p->data=x;//数据存入指针的数据域
p->next=L->next;//新结点指向头结点的下一个结点
L->next=p;//头结点的下一个结点指向新结点
scanf("%d",&x);
}
return L;
}
- 尾插法
思想:每次将新结点插入在链表最末端,需增加尾指针
过程图如下:
代码如下:
Linklist TailInster(Linklist &L)
{
int x;//数据域
L=(Linklist)malloc(sizeof(Lnode));//建立头结点
Lnode *s,*r=L;//增加尾指针并指向链表L
L->next=NULL;
scanf("%d",&x);
while (x!=9999)
{
s=(Lnode *)malloc(sizeof(Lnode));//建立新结点
s->data=x;//数据域赋值
r->next=s;//使链表尾结点指向新结点,即新结点放在原链表最末端
r=s;//令尾指针等于新的结点s,即r等于新链表的尾指针
scanf("%d",&x);
}
L->next=NULL;
return L;
}
//说明:尾插法可以这么理解:在循环条件下,反复令新结点s插入在原链表L的尾指针r的后面,而r又反复指向每次新链表的最后一个结点。
- 补充说明:今天介绍的两种插入方法非常重要,一定要理解,动手画链表的结点图型,在脑子里绕不如画图来的清晰!