Craze.0&1

软件是计算机的灵魂-而我是灵魂的设计师

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  7 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

常用链接

留言簿(1)

搜索

  •  

最新随笔

最新评论

阅读排行榜

评论排行榜


 地址:http://www.cppblog.com/0and1/     |   E-Mail:firenight@163.com     |   QQ:79688942   |




作业描述:

 

第一次作业(仅一题)


一、作业要求:
  
  
1、你必须写两个文件,文件名命名统一如下:

       (
1)list.h             //头文件。
       (
2)main.c             //主函数。
   
  
2、头文件中除了所有函数声明,还包含以下内容:
      
      typedef struct student   
      {
          char  first_name[
10];
          char  last_name[
10];
          char  student_id[
12];      //学生学号
          char  gender;              
//or f
          
int   age;
      } Data;


      typedef struct list_node {
                   Data        d;
                   struct list_node  
*next;
      } Node;

  
3、除了main函数以外,main.c文件中还要求包含以下五个函数:    
      Node 
*create_list(Data *array,int size)        //用动态的方法建立五个节点,该函数返回链表的头指针。
      void print_list(Node 
*head)                    //打印,打印出所有节点的函数,要求有适当的换行。
      
int count_list(Node *head)                     //统计节点数。 
      void insert_node(Node 
*p1,Node *p1,Node *q)    //插入一个节点。
      void delete_node(Node 
*head,Node *p)           //删除一个节点。
      void clear_list(Node 
*head);                   //删除所有的节点,并且用free释放空间。

  
4、主函数的要求: 
         (
1)用静态的方法建立三个节点,节点数据如下:
                first_name     last_name     student_id   gender  age 
               
-------------------------------------------------------
                Jacky          Chen          N3060101101    m     
19
                Jacky          Zhang         N3060101102    f     
18
                Jay            zhou          N3060101103    m     
20
              然后调用print_list和count_list函数。
       
         (
2)用create_list建立一个linked list(链表),节点数据从文件data.txt中读取,然后调用print_list和count_list函数。


         (
3)用insert_node函数在名字为lixiang zhang和shuang huang的节点之间插入一个节点,名字分别是Andy Liu,然后调用                      print_list和count_list函数验证是否已经插入节点。

         (
4)用delete_node函数删除名字为dongmei wang的节点,同样调用print_list和count_list函数验证是否已经删除该节点。

              提示:
1.从data.txt中读数据到节点中用fscanf函数。
                    
2.对有能力的同学不要用fsanf函数,写一个函数,每次从文本文件中读一行到buffer中,然后再从buffer里面把每
                     个字提取出来,功能相当于与fscanf。
                    
3.在调用create_list之前先建立一个数组,将所有值向节点的指针放到buffer数组中,然后再从buffer中读取。
            
  注意:任何时候调用print_list之前,之后,必须调用printf(
"\n")换行!
           
    

DATA.TXT
xiang      chen    N3060110201   m   20
lixiang    zhang   N3060110202   m   
19
shuang     huang   N3060110203   f   
19
xiaoming   zhao    N3060110204   m   
18
dongmei    wang    N3060110205   f   
21

我的想法:

#include <stdio.h>
#include 
<malloc.h>
#include 
<stdlib.h>
#include 
<string.h>
//#include <list.h>

typedef struct student   
{
    char  first_name[
10];
    char  last_name[
10];
    char  student_id[
12];      //学生学号
    char  gender;              
//or f
    
int   age;
} Data;


typedef struct list_node {
    Data        d;
    struct list_node  
*next;
} Node;

Node 
*create_list(Data arr[],int size);        //用动态的方法建立五个节点,该函数返回链表的头指针。
void print_list(Node 
*head);                    //打印,打印出所有节点的函数,要求有适当的换行。
int count_list(Node *head);                     //统计节点数。 
void insert_node(Node 
*p1,Node *p2,Node *q);    //插入一个节点。
void delete_node(Node 
*head,Node *p);           //删除一个节点。
void clear_list(Node 
*head);                   //删除所有的节点,并且用free释放空间。


Data arr_static[
3= {{"Jacky","Chen","N3060101101",'m',19},
                        {"Jacky","Zhang","N3060101102",'f',18},
                        {"Jay","zhou","N3060101103",'m',20}};

void main()
{
//静态建立并输出
    Node 
*head,*tail,*temp;
    head
=NULL;
    tail
=NULL;
    
for (int i=0;i<3;i++)
    {
        temp 
= (Node *)malloc(sizeof(Node));//建立新节点
    
//向新节点中添入内容
        strcpy(temp
->d.first_name,arr_static[i].first_name);
        strcpy(temp
->d.last_name,arr_static[i].last_name);
        strcpy(temp
->d.student_id,arr_static[i].student_id);
        temp
->d.gender = arr_static[i].gender;
        temp
->d.age = arr_static[i].age;
    
        
if(head==NULL)
            head 
= temp;//如果链表不存在 新节点便是头节点
        
else tail->next = temp;//将新节点链入链尾
        tail 
= temp;//改变尾指针
    }
    
if(tail!=NULL)
        tail
->next = NULL;
    printf(
"静态建立并输出,按回车继续\n");
    getchar();
    print_list(head);
    printf(
"\n总共有 %d 个记录\n",count_list(head));
    clear_list(head);

//动态建立并输出
    FILE 
*fp;
    Data arr[
5];
    Node 
*records;
    fp 
= fopen("c:\data.txt","r");
    
for (i=0;i<5;i++)
    {
        fscanf(fp,
"%s%s%s%s%d",&arr[i].first_name,&arr[i].last_name,&arr[i].student_id,&arr[i].gender,&arr[i].age);
    }
    fclose(fp);
    records 
= create_list(arr,5);
    printf(
"\n动态建立并输出,按回车继续\n");
    getchar();
    printf(
"\n");
    print_list(records);
    printf(
"\n总共有 %d 个记录\n",count_list(records));

//插入节点并验证
    Node 
*p1,*p2,*q;
    q 
= (Node *)malloc(sizeof(Node));
    strcpy(q
->d.first_name,"Andy"); //对插入节点赋值
    strcpy(q
->d.last_name,"Liu");
    strcpy(q
->d.student_id,"N3060101999");
    q
->d.gender = 'f';
    q->d.age = 55;
    q
->next = NULL;
    temp 
= records;
    
while (temp!=NULL//查找
    {
        
if (!strcmp(temp->d.first_name,"lixiang"&& !strcmp(temp->d.last_name,"zhang") || !strcmp(temp->d.first_name,"shuang"&& !strcmp(temp->d.last_name,"huang"))
        {
            p1 
= temp;
            p2 
= temp->next;
            break;
        }
        
else 
            temp 
= temp->next;
    }
    insert_node(p1,p2,q);
    printf(
"\n插入节点并验证,按回车继续\n");
    getchar();
    printf(
"\n");
    print_list(records);
    printf(
"\n总共有 %d 个记录\n",count_list(records));

//删除节点
    temp 
= records;
    
while (temp!=NULL//查找
    {
        
if (!strcmp(temp->d.first_name,"dongmei"&& !strcmp(temp->d.last_name,"wang"))
            break;
        
else 
            temp 
= temp->next;
    }
    delete_node(records,temp);
    printf(
"\n删除节点并验证,按回车继续\n");
    getchar();
    printf(
"\n");
    print_list(records);
    printf(
"\n总共有 %d 个记录\n",count_list(records));

//释放指针
    clear_list(records);
    printf(
"\n\n程序结束,所有指针已释放\n");
    getchar();

}

Node 
*create_list(Data arr[],int size) //用动态的方法建立五个节点,该函数返回链表的头指针。
{
    Node 
*head,*tail,*temp;
    head
=NULL;
    tail
=NULL;
    
for (int i=0;i<size;i++)
    {
        temp 
= (Node *)malloc(sizeof(Node));
        strcpy(temp
->d.first_name,arr[i].first_name);
        strcpy(temp
->d.last_name,arr[i].last_name);
        strcpy(temp
->d.student_id,arr[i].student_id);
        temp
->d.gender = arr[i].gender;
        temp
->d.age = arr[i].age;
        
if(head==NULL)
            head 
= temp;//如果链表不存在 新节点便是头节点
        
else tail->next = temp;//将新节点链入链尾
        tail 
= temp;//改变尾指针
    }
    
if(tail!=NULL)
        tail
->next = NULL;
    return head;
}

void print_list(Node 
*head) //打印,打印出所有节点的函数,要求有适当的换行
{
    Node 
*p;
    p 
= head;
    printf(
"姓\t名\t   学号\t\t 性别\t年龄\n");
    
for (int i=0;i<50;i++)
        printf(
"-");
    printf(
"\n");
    
while (p!=NULL)
    {
        printf(
"%s\t%-11s%s\t  %c\t %d\n",p->d.last_name,p->d.first_name,p->d.student_id,p->d.gender,p->d.age);
        p 
= p->next;
    }
    
for (i=0;i<50;i++)
        printf(
"-");
}

int count_list(Node *head) //统计节点数
{
    Node 
*p;
    
int i=0;
    p 
= head;
    
while (p!=NULL)
    {
        i
++;
        p 
= p->next;
    }
    return i;
}
void insert_node(Node 
*p1,Node *p2,Node *q) //插入一个节点
{
    p1
->next = q;
    q
->next = p2;
}

void delete_node(Node 
*head,Node *p) //删除一个节点
{
    Node 
*temp;
    temp 
= head;
    
if (p==head) 
        head 
= head->next;
    
else
    {
        
while (temp->next!=p)
            temp 
= temp->next;
        
if (p->next==NULL)
            temp
->next = NULL;
        
else
            temp
->next = p->next;
    }
        
}

void clear_list(Node 
*head)
{
    Node 
*p;
    
while (head!=NULL)
    {
        p 
= head;
        head 
= head->next;
        free(p);
    }        
}
posted on 2007-04-14 21:32 Craze.0&1 阅读(364) 评论(0)  编辑 收藏 引用 所属分类: 学习笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理