什么是链表
链表是一种常用的数据结构,今天我所学习的是单链表。
即在线性表中,每个元素只有一个前驱元素与一个后续元素,用链式结构存储。链表的结构如下图所示:
同时,链表满足关系一对一或者多对一,而不能有一对多的情况。
链表的构建
//构造链表(01234)
struct LinkNode* initLink(){
//创建头指针
struct LinkNode* p=NULL;
//创建头节点
struct LinkNode* temp=(struct LinkNode*)malloc(sizeof(struct LinkNode));
temp->val=0;
temp->next=NULL;
//将头指针指向头节点
p=temp;
//将后面创建的节点用前驱指针指向他
for(int i=1;i<5;i++){
//创建一个节点
struct LinkNode* a=(struct LinkNode*)malloc(sizeof(struct LinkNode));
a->val=i;
a->next=NULL;
//节点指向指针
temp->next=a;
temp=temp->next;
}
return p;
};
创建链表即在元素的节点部分即数据域中赋值。而对链表进行操作还要用到其指针域。
打印链表
void printLinkNode(struct LinkNode* p){
//定义一个指针遍历链表
struct LinkNode* temp=p;
//遍历输出
while(t){
printf("%d",temp->val);
temp=temp->next;
}
printf("\n");
}
计算链表长度
int LengthLinkNode(struct LinkNode* p){
//定义一个指针遍历
struct LinkNode* t=p;
int len=0;
//遍历
while(t){
len++;
t=t->next;
}
return t;
}
链表的插入
链表的插入可以分为在表头,表中以及表末之分。
在表头插入比较简单,即将head指向head->next,相当于跳过第一个元素。但这个时候我们需要一个新的node,使得node->next=head,之后便从node开始遍历整个链表。
在表末插入也比较简单,只需要将尾节点指向新的节点
当在表中插入时,我们首先需要定义一个newnode指向插入位置的那个节点,再将插入前一个节点指向newnode.
即若要将newnode插入17前面,需将newnode先指向17,再将15指向newnode
struct LinkNode* insertNode(struct LinkNode* head,struct LinkNode* nodeInsert,int position){
//当待插入节点是表头,或者不能插入时
if(head==NULL){
return nodeInsert;
}
//计算链表长度
int len=LengthLinkNode(head);
//判断不符合的情况
if(position>len+1||position<1){
printf("参数越界");
return head;
}
//定义一个指针指向头指针
struct LinkNode* pNode=head;
//遍历链表,找到要插入的链表中的位置
int num=1;
while(num<position-1){
pNode=pNode->next;
num++;
}
nodeInsert->next=pNode->next;
pNode->next=nodeInsert;
return head;
};
链表的删除
链表的删除,若是删除表头,只需要head=head->next,若是表尾的删除,只需要判断
cur->next=链表的最后一个元素,然后使cur->next=NULL。若是表中删除,需要将待删除元素position,使得cur->next=position->next
struct LinkNode* deledteNode(struct LinkNode*head ,int position){
if(head==NULL){
return NULL;
}
int len=LengthLinkNode(head);
if(position>size||position<1){
printf("Input error");
return head;
}
//删除表头
if(position==1){
struct LinkNode* curNode=head;
head=head->next;
free(curNode);
return head;
}
else{
struct LinkNode*cur=head;
int n=1;
while(n=position-1){
cur=cur->next;
n++;
}
struct LinkNode*temp=cur->next;
cur->next=temp->next;
free(temp);
return head;
}
};