Day02_数据结构
01.画图
02.按位置查找返回元素的值
//11.按位置查找后返回元素的值
int find_pos(node_p H,int pos)
{
if(H==NULL){return -1;}
if(pos<0){
return -1;
}
if(pos<0){
printf("查找的位置不合理.
");
return -2;
}
node_p p=H->next;//从第一个数据结点开始遍历
int i;
//找到pos结点
for(i=0,p=H;inext);
//找到pos-1位置结点,判断是否有pos位置
if(p==NULL){
printf("11.位置不合理.
");
return -2;
}
return p->data;
}
03.按值修改(多个一样的值修改第一个)
//12.按值修改(多个一样的值修改第一个)
//多个值只修改第一个
void updatavalue(node_p H,int value1,int value2)
{
if(H==NULL){return;}
node_p p=H->next;
while(p!=NULL){
if(p->data==value1){
p->data=value2;
printf("查找%d的值修改为%d的值.
",value1,value2);
return;
}
p=p->next;
}
printf("未查找到值为%d的结点,无法修改.
",value);
}
第一种情况:多个值一样修改
//13.按值修改(多个一样的值修改第一个)
//多个值全部修改
void updatavalue(node_p H,int value1,int value2)
{
if(H==NULL){return;}
node_p p=H->next;
int modified_count=0;
while(p!=NULL){
if(p->data==value1){
p->data=value2;
modified_count++;
}
p=p->next;
}
if(modified_count>0){
printf("成功将%d个值为%d修改为%d.
",modified_count,value1,value2);
}else{
printf("未找到值为%d的结点,无法修改.
",value1);
}
}
04.单向链表的逆置
方法01:迭代的思想
//14.单项链表逆置
node_p reverseList(node_p H)
{
if(H==NULL){return NULL;}
node_p prev=NULL;
node_p curr=H->next;
node_p next=NULL;
while(curr!=NULL)
{
//第一步保存curr下一个结点到next指针中
next=curr->next;
//反转当前结点的指针
curr->next=prev;
//移动prev和curr指针
prev=curr;
curr=next;
}
H->next=prev;
return H;
}
方法02:头插的思想
node_p reverseList(node_p H)
{
if(H==NULL){return NULL;}
node_p new_head=NULL;//初始化新链表的头结点
node_p current=H->next;//用于遍历原链表的指针
node_p next_node;//临时保存当前结点的下一个结点
while(current!=NULL){
next_node=current->next;//保存当前结点下一个结点
current->next=new_head;//将当前结点插入到新链表头部
new_head=current;//更新新链表头结点
current=next_node;//移动到原链表的下一个结点
}
H->next=new_head;
return H;//返回逆置后链表的头节点
}