zoukankan      html  css  js  c++  java
  • 第十二周作业及总结

    本周教学目标
    要求学生能够掌握(1)二级指针的概念,以及指针数组的应用;(2)了解指针与函数的关系,掌握指针作为函数返回值;(3)掌握单向链表的概念和操作(建立、增加、删除、修改、遍历)

    本周作业头
    这个作业属于那个课程 C语言程序设计II
    这个作业要求在哪里 <写上作业的链接>
    我在这个课程的目标是 <写上你的目标>
    这个作业在那个具体方面帮助我实现目标 <写上具体方面>
    参考文献 <写上作业所参考的文献资料>
    基础作业
    PTA:1.函数题:计算最长的字符串长度

       2.函数题:统计专业人数

       3.函数题:删除单链表偶数结点

    挑战作业
    PTA:1.编程题:八皇后问题(用递归法)实现 2.编程题:求迷宫最短通道

    上周已完成挑战题的同学,请告知本周你在挑战题的算法上有些什么新的想法和改进?也可以列出你向哪些同学进行了挑战题的讲解,你是如何讲解的(请务必附上你讲解对象的学号)。

    预习作业
    从第十三周开始,将进入课程设计阶段,请在本次作业中给出:

    1.所在小组想要开发的项目的名称和目标;

    2.项目主体功能的描述;

    3.现阶段已做的准备工作;

    4.小组成员名单和进度安排。(课程设计阶段:13-17周)

    6-1 计算最长的字符串长度 (15 分)
    本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。

    函数接口定义:
    int max_len( char *s[], int n );
    其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。

    裁判测试程序样例:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define MAXN 10
    #define MAXS 20
    
    int max_len( char *s[], int n );
    
    int main()
    {
        int i, n;
        char *string[MAXN] = {NULL};
    
        scanf("%d", &n);
        for(i = 0; i < n; i++) {
            string[i] = (char *)malloc(sizeof(char)*MAXS);
            scanf("%s", string[i]);
        }
        printf("%d
    ", max_len(string, n));
    
        return 0;
    }
    

    /* 你的代码将被嵌在这里 */
    输入样例:
    4
    blue
    yellow
    red
    green
    输出样例:
    6

    代码

    int max_len( char *s[], int n )
    {
        int m=0;
        for(int i=0;i<n;i++)
        {
            int t=strlen(s[i]);
            if(m < t)
            {
                m=t;
            }
        }
        return m;
    } 
    


    在程序中,根据输入颜色字符串的长短,通过函数malloc()动态分配相应大小的内存单元,通过数组指向动态分配的内存单元,代码通过查阅得到

    6-2 统计专业人数 (15 分)
    本题要求实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:

    struct ListNode {
    char code[8];
    struct ListNode *next;
    };
    这里学生的学号共7位数字,其中第2、3位是专业编号。计算机专业的编号为02。

    函数接口定义:
    int countcs( struct ListNode *head );
    其中head是用户传入的学生学号链表的头指针;函数countcs统计并返回head链表中专业为计算机的学生人数。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct ListNode {
        char code[8];
        struct ListNode *next;
    };
    
    struct ListNode *createlist(); /*裁判实现,细节不表*/
    int countcs( struct ListNode *head );
    
    int main()
    {
        struct ListNode  *head;
    
        head = createlist();
        printf("%d
    ", countcs(head));
    	
        return 0;
    }
    

    /* 你的代码将被嵌在这里 */
    输入样例:
    1021202
    2022310
    8102134
    1030912
    3110203
    4021205

    输出样例:
    3

    代码

    int countcs( struct ListNode *head )
    {
        int num = 0;
        struct ListNode  *p = head;
        while(p != NULL)
        {
            if(p->code[1] == '0' && p->code[2] == '2')
                num++;
            p = p->next;
        }
        return num;
    }
    


    代码通过main()统一调用建立链表,新增加的结点总是在链表的末尾,所以该新增结点的next域应置成NULL:p->next=NULL
    并把原来链表的尾节点的next域指向该新增的结点,这样就把新增加的结点加入到了链表中,代码通过书上查阅及结对编程伙伴讨论得出

    6-3 删除单链表偶数节点 (20 分)
    本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下:

    struct ListNode {
    int data;
    struct ListNode *next;
    };
    函数接口定义:
    struct ListNode *createlist();
    struct ListNode *deleteeven( struct ListNode *head );
    函数createlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。

    函数deleteeven将单链表head中偶数值的结点删除,返回结果链表的头指针。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct ListNode {
        int data;
        struct ListNode *next;
    };
    
    struct ListNode *createlist();
    struct ListNode *deleteeven( struct ListNode *head );
    void printlist( struct ListNode *head )
    {
         struct ListNode *p = head;
         while (p) {
               printf("%d ", p->data);
               p = p->next;
         }
         printf("
    ");
    }
    
    int main()
    {
        struct ListNode *head;
    
        head = createlist();
        head = deleteeven(head);
        printlist(head);
    
        return 0;
    }
    

    /* 你的代码将被嵌在这里 */
    输入样例:
    1 2 2 3 4 5 6 7 -1
    输出样例:
    1 3 5 7

    代码

    struct ListNode *createlist(){
    	struct ListNode * p ,*head=NULL,*tail;
    	int size = sizeof (struct ListNode);
    	int n,z;
    	scanf("%d",&n);
    	for (z=0;n!=-1;z++)
    	{
    		
    		p=(struct ListNode *) malloc(size);
    		p->data = n;
    		
    		if(head==NULL){
    			head=p;
    			tail=p;
    		}
    		else {
    			tail->next = p;
    		}
    		tail = p;
    		scanf("%d",&n);
    	}
    	p->next=NULL;
    	return head;
    } 
    struct ListNode *deleteeven( struct ListNode *head )
    {
    	struct ListNode *p,*p1,*p2;
    	while(head && head->data %2 ==0){ 
    		p1=head;
    		head = head->next;
    		free(p1);
    	}
    	p1=head;
    	while(p1 && p1 ->next !=NULL) 
    	{
    		while(p1->next && p1->next->data%2==0)
    		{	
    			p2=p1->next;
    			p1->next=p2->next;	
    		}
    		p1=p1->next;
    	}
    	return head;
    }
    


    此题与上题略有相似,代码是查找加改编

    本周学习了用链表构建信息库和指针变量和函数指针调用函数

  • 相关阅读:
    真正的e时代
    在线手册
    UVA 10616 Divisible Group Sums
    UVA 10721 Bar Codes
    UVA 10205 Stack 'em Up
    UVA 10247 Complete Tree Labeling
    UVA 10081 Tight Words
    UVA 11125 Arrange Some Marbles
    UVA 10128 Queue
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/zou1223/p/10880397.html
Copyright © 2011-2022 走看看