题目:带头结点单向循环链表L中的数据元素为整数且非递增有序,删除L中所有值大于mink且小于maxk的元素(若表中存在这样的元素),并将删除后链表L分解成两个带头结点单向循环链表L1、L2,使两个链表中各自仅含奇数或偶数。
源代码
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef int Status;
typedef struct Date Date;
struct Date{
int date;
Date *next;
};
Date creatlist(int n) //n为链表的长度,尾插法建立链表
{
Date * head;
Date *r;
Date *q;
head=(Date *)malloc(sizeof(Date));
r=head;
printf("请输入第一个元素:");
q=(Date *)malloc(sizeof(Date));
scanf("%d",&q->date);
q->next=head;
r->next=q;
r=q;
for(int i=0;i<n-1;i++){
printf("\n请输入第%d个元素:",i+2);
q=(Date *)malloc(sizeof(Date));
scanf("%d",&q->date);
q->next=r;
r=q;
}
head->next=r;
return *head;
}
void print(Date *date){
Date *r;
Date *q;
q=date;
r=date->next;
printf("%d\n",r->date);
printf("%d",q->date);
/* while (r!=date){
printf("%d",r->date);
r=r->next;
}*/
}
void handle(Date *date1,int mink,int maxk)
{
Date *r;
Date *q;
Date *p;
r=date1;
int flag_maxk=0;
while(r!=date1){
if(r->next->date<=maxk&&flag_maxk==0)
{
flag_maxk=1;
q=r;
}
if(r->date<=mink){
p=r;
break;
}
r=r->next;
}
if(r==date1)
p=date1;
q->next=p;
}
int main(){
Date date;
int length;
int mink;
int maxk;
printf("\n请输入该链表L的长度:");
scanf("%d",&length);
date= creatlist(length);
printf(" date address:%p",&date);
print(&date);
/* printf("\n请输入删除L中所有值大于mink");
scanf("%d",&mink);
printf("\n请输入删除L中所有值小于maxk");
scanf("%d",&maxk);
handle(&date,mink,maxk);
print(date);*/
return 0;
}
个人猜想
如果单纯的这样做函数中的*data只不过复制了传进来的内容,具体要传地址还需要main函数的Date date改为Date *date,传入真正的地址。
结果![导入地址](https://i-blog.csdnimg.cn/blog_migrate/a98d6c694f50ea0a1cf870d02088efdc.png)
将Date date改为Date *date,成功解决该问题。保证了函数内的头节点地址和传入头节点地址相同