1. 学习目的
1.理解c语言中是如何建造出链表的
2.链表增加时各部分会有怎样的变化?
3.链表删除结点时各部分会有什么变化?
2.学习之后对上述问题的理解
2.1 理解c语言创建链表
首先,定义方面,链表是由结点/节点(两种称呼都对)组成的,而每个节点又是由储存数值的数据域和指向下一个节点地址的指针域组成,其中呢,头节点有利于遍历单链表等操作的实现,因此其比较重要。
要注意的是,虚拟节点是为了便于我们处理首部节点而存在的,就是头节点,其val不会被使用,可初始化为:0或-1,节点:dummyNode.next=head;要获得head节点时用~.next即可。
其次,代码实现方面
#include<stdio.h>
#include <stdlib.h>
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*LinkList;//定义别名
LinkList CreateLink(LinkList &L){
L=(Lnode*)malloc(sizeof(Lnode));//头结点!=头指针
L->data=0;//初始化链表
L->next=NULL;
int i=1;
while(i<5){
Lnode *a=(Lnode*)malloc(sizeof(Lnode));
a->data=i++;//给a节点的数值和指针域赋值
a->next=L->next;
L->next=a;
printf("->%2d",a->data);
}
return L;//指向头结点
}
int main(){
printf("初始化后的链表为:");
Lnode *p=NULL;//建立头指针
CreateLink(p);
return 0;
}
在这里插入代码片
嘿嘿,之前学过的数据结构都快忘完了,又看了好一会才想起来。
运行结果如下:
至此,建立链表结束。
2.2链表增加时各部分会有怎样的变化?
链表增加时主要时链表中插入了新的元素
首先时链表的遍历
LinkList printList(Lnode *p){
while(p!=NULL){
printf("->%d",p->data);
p=p->next;
}
然后就是插入了
//第i个位置插入元素
bool InsertList(LinkList &L,int i,int e){
if(i<1) return false;//位置不合理
Lnode *p;//指针p指向当前扫描到的结点
int j=0;//当前p指向的是第几个结点
p=L;//一定要让p指向当前头节点,否则会没用 ,头节点为第0个元素
while(p!=NULL&&j<i-1) {//找到第i-1个位置
p=p->next;
j++;
}
if(p==NULL){
return false;//i值不合法
}
Lnode *s= (Lnode*)malloc(sizeof(Lnode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
运行后结果:
元素增加后要先把数据存入新节点,然后改变新节点指针,最后再让第i-1个结点改变指针方向
2.3链表删除时各部分会有怎样的变化?
bool ListDelete(LinkList &L,int i,int &e) {
if(i<1)
return false;
Lnode *p;//当前指针扫描到的点;
int j=0;//p指针指向的是第几个点
p=L;//p指向头节点
while(p!=NULL&&j<i-1){//找到第i—1个位置
p=p->next;
j++;
}
if(p==NULL) return false;
if(p->next==NULL) //第i-1个就是最后一个结点
{
return false; }
Lnode *q= p->next;//q指向被删除结点,便于后续操作
e=q->data;//存储被返回值;
p->next=q->next;
free(q);//释放内存
//printf("被删除的元素为%d",&e);
return true;
}
运行结果:
主函数中再定义一个整数型变量e即可,并且删除过程中要先把删除的值储存起来,便于返回,其次就是要把新定义的结点指向待删除的结点,最后p->next=q->next;跳过被删除元素。
3.总结
呼,好久没怎么敲代码了,做个链表是真难。。。。一会这个报错,一会哪里忘了赋值。。。。
不过最后结果还算是好滴,明天继续加油!奥里给!