时间:2025-02-27 15:45
人气:
作者:admin
目前正在学习数据结构,刚刚学到单链表,写了一份简单的代码,自己来缕缕思路。
先上题:
typedef struct Node{
float val;
int index;
struct Node *next;
}Node;
int n;
scanf("%d",&n);
Node *head1=NULL;
Node *head2=NULL;
for(int i=0;i<n;i++){
float val;
int index;
scanf("%f %d",&val,&index);
createList(&head1,val,index);
}
sortlist(&head1);
scanf("%d",&n);
for(int i=0;i<n;i++){
float val;
int index;
scanf("%f %d",&val,&index);
createList(&head2,val,index);
}
sortlist(&head2);
首先是函数的形参:
void createList(Node **head,float val,int index)
为什么用二级指针的head呢?
其实很好理解(我认为(´;ω;`)),你想啊,我们的单链表等下需不需要排序?那么是不是有可能这个头节点会发生变化呢?都知道啊,这个二级指针它是一个指向指针的指针,记录的是一级指针的地址对吧,这意味着什么呢,就是你可以通过它去访问和修改一级指针,否则的话我们是不是一般情况下就动不了这个一级指针,对吧。诶,那么这样一来,是不是就可以改变这个头节点的值了?
然后呢就是函数的主体,我们可以肌肉记忆一样的去先申请一个newnode节点:
Node* newnode=(Node*)malloc(sizeof(Node));
newnode->val=val;
newnode->index=index;
newnode->next=NULL;
然后是逻辑部分,先上代码 :
if(*head==NULL){ *head =newnode; }
else{
Node* current=*head;
while(current->next !=NULL){
current=current->next;
}
current->next =newnode;
}
一样的,Node*current= *head; Node*p=NULL;
while(current){
p=current->next;
while(p){
if(current->index < p->index){
float tempval =current->val;
int tempindex =current->index;
current->index=p->index;
current->val=p->val;
p->index=tempindex;
p->val=tempval;
}
p=p->next;
}
current=current->next;
}
同款形参Node *Add(Node* head1,Node* head2)
同款开头
Node* result=NULL; Node* pa=head1; Node* pb=head2;
首先是一个循环,就是我们的pa和pb此时还没有到底while(pa&&pb)
while(pa&&pb){
if(pa->index == pb->index){
float sum=pa->val+pb->val;
if(sum!=0){
createList(&result,sum,pa->index);
}
pa=pa->next;
pb=pb->next;
}
else if(pa->index > pb->index){
createList(&result,pa->val,pa->index);
pa=pa->next;
}
else{
createList(&result,pb->val,pb->index);
pb=pb->next;
}
}
首先肯定是排序吧,那就来一句 sortlist(&result);
我问你,循环结束的条件是什么?
是不是a或者b其中一个跑到底了?那剩下的怎么办啊?(总不能放XX上卖了吧?qwq)
while (pa != NULL) {
if (pa->val != 0) {
createList(&result, pa->val, pa->index);
}
pa = pa->next;
}
while (pb != NULL) {
if (pb->val != 0) {
createList(&result, pb->val, pb->index);
}
pb = pb->next;
}
Node* result=Add(head1,head2);
Node* current=result;
for(int i=1;i<x&¤t!=NULL;i++)
current=current->next;
if (current != NULL) {
printf("%.1f %d\n", current->val, current->index);
}
这样一道题就AC了。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
float val;
int index;
struct Node *next;
}Node;
void createList(Node **head,float val,int index){
Node* newnode=(Node*)malloc(sizeof(Node));
newnode->val=val;
newnode->index=index;
newnode->next=NULL;
if(*head==NULL){
*head =newnode;
}
else{
Node* current=*head;
while(current->next !=NULL){
current=current->next;
}
current->next =newnode;
}
}
void sortlist(Node**head){
Node*current= *head;
Node*p=NULL;
while(current){
p=current->next;
while(p){
if(current->index < p->index){
float tempval =current->val;
int tempindex =current->index;
current->index=p->index;
current->val=p->val;
p->index=tempindex;
p->val=tempval;
}
p=p->next;
}
current=current->next;
}
}
Node *Add(Node* head1,Node* head2){
Node* result=NULL;
Node* pa=head1;
Node* pb=head2;
while(pa&&pb){
if(pa->index == pb->index){
float sum=pa->val+pb->val;
if(sum!=0){
createList(&result,sum,pa->index);
}
pa=pa->next;
pb=pb->next;
}
else if(pa->index > pb->index){
createList(&result,pa->val,pa->index);
pa=pa->next;
}
else{
createList(&result,pb->val,pb->index);
pb=pb->next;
}
}
sortlist(&result);
while (pa != NULL) {
if (pa->val != 0) {
createList(&result, pa->val, pa->index);
}
pa = pa->next;
}
while (pb != NULL) {
if (pb->val != 0) {
createList(&result, pb->val, pb->index);
}
pb = pb->next;
}
return result;
}
int main(){
int n;
scanf("%d",&n);
Node *head1=NULL;
Node *head2=NULL;
for(int i=0;i<n;i++){
float val;
int index;
scanf("%f %d",&val,&index);
createList(&head1,val,index);
}
sortlist(&head1);
scanf("%d",&n);
for(int i=0;i<n;i++){
float val;
int index;
scanf("%f %d",&val,&index);
createList(&head2,val,index);
}
sortlist(&head2);
int x;
scanf("%d",&x);
Node* result=Add(head1,head2);
Node* current=result;
for(int i=1;i<x&¤t!=NULL;i++)
current=current->next;
if (current != NULL) {
printf("%.1f %d\n", current->val, current->index);
}
return 0;
}
下一篇:C语言中while与for的区别