第三次作业
C高级第三次作业(1)
6-1 输出月份英文名
1.设计思路
(1)描述算法
第一步:阅读题目,明确目的。
第二步:找到调用函数。
第三步:定义指针数组*month,初始化为12月份。
第四步:如果输入的n小于1或大于12,则返回NULL,否则返回month[n-1]。
(2)流程图
2.实验代码
char *getmonth( int n )
{
int i;
char *month[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
if(n<1||n>12)
{
return NULL;
}
else
{
return month[n-1];
}
}
3.本题调试过程中碰到的问题及解决办法
错误原因:
改正方法:将n>1&&12>n改为1>n||n>12。
将return NULL;与 return month[n-1];掉换顺序。
6-2 查找星期
1.设计思路
(1)描述算法
第一步:阅读题目,明确目的。
第二步:找到调用函数。
第三步:定义指针数组*a,并初始化为"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
第四步:遍历数组内所有元素,利用strcmp函数做比较,如果值为0,则返回i,否则返回-1.
2.实验代码
int getindex( char *s )
{
int i;
char *a[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
for(i=0;i<7;i++)
{
if(strcmp(s,a[i])==0)
{
return i;
}
}
return -1;
}
3.本题调试过程中碰到的问题及解决办法
错误原因:
改正方法:将return -1放到for循环之外。
将*a[i]改为a[i]。
将*s改为s。
6-3 计算最长的字符串长度
1.设计思路
(1)描述算法
第一步:阅读题目,明确目的。
第二步:找到调用函数。
第三步:定义i,t,max。max,i初始化为0。
第四步:遍历数组中元素。利用strlen计算s[i]字符串的长度并将其赋给t。
第五步:如果max<t,则将t赋给max。
第六步:返回max。
2.实验代码
int max_len( char *s[], int n )
{
int i=0, t;
int max=0;
for(i=0; i<n; i++)
{
t = strlen(s[i]);
if(max < t)
{
max = t;
}
}
return max;
}
3.本题调试过程中碰到的问题及解决办法
错误原因:
改正方法:将t = strlen(s[i]);放在for循环内。
6-4 指定位置输出字符串
1.设计思路
(1)描述算法
第一步:阅读题目,明确目的。
第二步:找到调用函数。
第三步:定义p,q,指针*m=NULL。
第四步:遍历指针数组*s中所有元素。如果ch1等于 *(s+p),则将s[p]赋给 *z。
第五步:遍历s中元素,如果(s+q)!=ch2)&&((s+q)!='\0',则输出(s+q),如果(s+q)!='\0',则输出*(s+q)。
第六步:返回m。
2.实验代码
char *match( char *s, char ch1, char ch2 ){
int p,q;
char *m=NULL;
for(p=0;*(s+p)!='\0';p++)
{
if(*(s+p)==ch1)
{
char *z= &s[p];
for(q=p;(*(s+q)!=ch2)&&(*(s+q)!='\0');q++)
{
printf("%c",*(s+q));
}
if(*(s+q)!='\0')
printf("%c",*(s+q));
printf("\n");
return z;
}
}
printf("\n");
return m;
}
3.本题调试过程中碰到的问题及解决办法
错误原因:
改正方法:在printf("%c",*(s+q));后加换行。
将q=0换成q=p。
C高级第三次作业(2)
6-1 奇数值结点链表
1.设计思路
(1)描述算法
第一步:阅读题目,明确目的。
第二步:找到调用函数。
第三步:创立链表m1,m2并申请空间。将数字输入到m1中。利用while语句进行循环,直到-1时跳出循环:如果头结点为空,则将m1赋给head。否则将m1赋给m2->next。循环之后将NULL赋给m2->next,返回head。
第四步:创立链表,如果*L不为空,则遍历所有元素。如果head1除2不等于0,如果head2为空,则将head1赋给head2,否则将head1赋给a1->next。如果a2为空,则将head1赋给a2。否则将head1赋给k->next。
第五步:如果k不为空,则将NULL赋给k->next。否则返回NULL。
第六步:返回head2。
2.实验代码
struct ListNode *readlist()
{
struct ListNode *head=NULL,*m1=NULL,*m2=NULL;
int data;
m1=m2=(struct ListNode *)malloc(sizeof(struct ListNode));
scanf("%d",&m1->data);
while(m1->data!=-1)
{
if(head==NULL)
{
head=m1;
}else
{
m2->next=m1;
}
m2=m1;
m1=(struct ListNode *)malloc(sizeof(struct ListNode));
scanf("%d",&m1->data);
}
m2->next=NULL;
return(head);
}
struct ListNode *getodd( struct ListNode **L )
{
struct ListNode *head1=NULL,*head2=NULL,*a1=NULL,*a2=NULL,*k=NULL;
if(*L!=NULL)
{
for(head1=*L;head1!=NULL;head1=head1->next)
{
if(head1->data%2!=0)
{
if(head2==NULL)
{
head2=head1;
}else
{
a1->next=head1;
}
a1=head1;
}else
{
if(a2==NULL)
{
a2=head1;
}else
{
k->next=head1;
}
k=head1;
}
}
a1->next=NULL;
if(k!=NULL)
{
k->next=NULL;
}
*L=a2;
}else
{
return NULL;
}
return(head2);
}
3.本题调试过程中碰到的问题及解决办法
错误原因:
改正方法:将*m1, *m2,head赋值为NULL。
6-2 学生成绩链表处理
1.设计思路
(1)描述算法
第一步:阅读题目,明确目的。
第二步:找到调用函数。
第三步:建立链表,输入num,利用while语句进入循环,直到num=0。
第四步:输入名字和分数。存入p1中,如果头结点为空,则将p1赋给头结点。否则将p1赋给p2->next。p1=p2。在输入num。返回头结点。
第五步:利用while语句进行循环。将head赋给t2,head->next赋给head。删除t2。
第六步:如果头结点为空。返回NULL。
第七步:将head赋给t1,将head->next赋给t2。利用while语句进行循环,如果t2->score < min_score,则将t2->next赋给 t1->next,并删除t2。否则将t2赋给t1,将t1->next赋给t2。返回头结点。
2.实验代码
struct stud_node *createlist()
{
struct stud_node *p1=NULL,*p2=NULL,*head=NULL;
int num;
scanf ("%d", &num);
while (num != 0)
{
p1 = (struct stud_node *)malloc (sizeof (struct stud_node));
scanf ("%s %d", p1->name, &p1->score);
p1->num = num;
p1->next = NULL;
if (head == NULL)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
scanf ("%d", &num);
}
return head;
}
struct stud_node *deletelist( struct stud_node *head, int min_score )
{
struct stud_node *t1, *t2;
while (head != NULL && head->score < min_score)
{
t2 = head;
head = head->next;
free(t2);
}
if (head == NULL)
{
return NULL;
}
t1 = head;
t2 = head->next;
while (t2 != NULL)
{
if (t2->score < min_score)
{
t1->next = t2->next;
free(t2);
}else
{
t1 = t2;
t2 = t1->next;
}
}
return head;
}
3.本题调试过程中碰到的问题及解决办法
错误原因:
6-3 链表拼接
1.设计思路
(1)描述算法
第一步:阅读题目,明确目的。
第二步:找到调用函数。
第三步:建立链表。如果头结点为空则返回头结点。
第四步:利用while语句进行循环。将head赋给now,将now->next赋给next,将NULL赋给last。在进行while循环,如果now->data>next->data,则将next->next赋给now->next,将now赋给next->next,如果last为空,则将next赋给head,否则将last->next赋给next,last->next赋给now,now->next赋给next,返回头结点。
第五步:如果list为空,则将list2赋给head,否则将list1 赋给last。利用while语句进行循环,将last->next赋给last。将list2赋给last->next。返回头结点。
2.实验代码
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
struct ListNode *sortlink(struct ListNode *head)
{
struct ListNode *now,*next,*last;
int control=1;
if(head==NULL) return head;
while(control==1)
{
control=0;
now=head;
next=now->next;
last=NULL;
while(next!=NULL)
{
if(now->data>next->data)
{
now->next=next->next;
next->next=now;
if(last==NULL) head=next;
else last->next=next;
control=1;
}
if(last==NULL) last=head;
else last=last->next;
now=last->next;
next=now->next;
}
}
return head;
}
struct ListNode *head=list1,*last=NULL;
if(list1==NULL)
{
head=list2;
}
else
{
last=list1;
while(last->next!=NULL)
{
last=last->next;
}
last->next=list2;
}
head=sortlink(head);
return head;
};
3.本题调试过程中碰到的问题及解决办法
错误原因:
改正方法:将last初始化为NULL。
学习总结和进度
1.知识总结
最近学习了链表的创建,删除,链接。学的不是很明白,后期努力。