地址:http://www.cppblog.com/0and1/ | E-Mail:firenight@163.com | QQ:79688942 |
作业描述:
第一次作业(仅一题)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
一、作业要求:
1、你必须写两个文件,文件名命名统一如下:
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
(1)list.h //头文件。
(2)main.c //主函数。
2、头文件中除了所有函数声明,还包含以下内容:
typedef struct student
{
char first_name[10];
char last_name[10];
char student_id[12]; //学生学号
char gender; //m or f
int age;
} Data;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
typedef struct list_node {
Data d;
struct list_node *next;
} Node;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
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释放空间。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
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函数。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
(3)用insert_node函数在名字为lixiang zhang和shuang huang的节点之间插入一个节点,名字分别是Andy Liu,然后调用 print_list和count_list函数验证是否已经插入节点。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
(4)用delete_node函数删除名字为dongmei wang的节点,同样调用print_list和count_list函数验证是否已经删除该节点。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
提示:1.从data.txt中读数据到节点中用fscanf函数。
2.对有能力的同学不要用fsanf函数,写一个函数,每次从文本文件中读一行到buffer中,然后再从buffer里面把每
个字提取出来,功能相当于与fscanf。
3.在调用create_list之前先建立一个数组,将所有值向节点的指针放到buffer数组中,然后再从buffer中读取。
注意:任何时候调用print_list之前,之后,必须调用printf("\n")换行!
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
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>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
typedef struct student
{
char first_name[10];
char last_name[10];
char student_id[12]; //学生学号
char gender; //m or f
int age;
} Data;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
typedef struct list_node {
Data d;
struct list_node *next;
} Node;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
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释放空间。
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
Data arr_static[3] = {{"Jacky","Chen","N3060101101",'m',19},
{"Jacky","Zhang","N3060101102",'f',18},
{"Jay","zhou","N3060101103",'m',20}};
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
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);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//动态建立并输出
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));
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//插入节点并验证
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));
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//删除节点
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));
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//释放指针
clear_list(records);
printf("\n\n程序结束,所有指针已释放 \n");
getchar();
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
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;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
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("-");
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
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;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
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;
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
void clear_list(Node *head)
{
Node *p;
while (head!=NULL)
{
p = head;
head = head->next;
free(p);
}
}
|