-
C第十三天
老师今天讲的内容比较少,只有双向循环链表和makefile的使用方法,老师先给我们解决了昨天留的作业,然后才讲新内容。作业里的代码和题目有点出入,但是更改代码位置也能表达出作业里面的意思。老师说下周一要进行阶段考试,成绩不合格的要留到下一个班重学,下周还要做阶段性的项目,还要针对项目进行答辩,看了一下项目,感觉难度好大,要求好多,但是也能检验这一段时间的学习成果,想到这儿不禁要为自己捏把汗。
homework:新建一条链表,把链表里的数据读到文件中,然后把文件中的数据读到另一条链表中
#include<stdio.h>
#include<stdlib.h>
//建立数据结构体
typedef struct stu
{
char name[20];
int id;
int age;
}DATA,*PDATA;
//建立节点结构体
typedef struct node
{
DATA data;
struct node *next;
}NODE,*PNODE;
DATA getData()
{
DATA tmp;
printf("输入姓名:");
gets(tmp.name);
printf("请输入学号:");
scanf("%d",&tmp.id);getchar();
printf("请输入年龄:");
scanf("%d",&tmp.age);getchar();
return tmp;
}
void disPlay(PNODE head)
{
PNODE p = head->next;
while(p != NULL)
{
printf("姓名:%s 学号:%d 年龄:%d\n",p->data.name,p->data.id,p->data.age);
p = p->next;
}
}
PNODE createNode(DATA data)
{
PNODE tmp = (PNODE)malloc(sizeof(NODE));
tmp->data = data;
tmp->next = NULL;
return tmp;
}
void insertNode(PNODE head,DATA data)
{
PNODE tmp = createNode(data);
tmp->next = head->next;
head->next = tmp;
}
//读取文件数据
void loadData(PNODE head)
{
DATA data;
FILE *fp = fopen("student.txt","r+");
if(NULL == fp)
{
printf("文件读取失败!\n");
exit(0);
}
while(fread(&data,sizeof(DATA),1,fp) == 1)
{
insertNode(head,data);
}
fclose(fp);
}
void saveData(PNODE head)
{
FILE *fp = fopen("student.txt","w+");
PNODE p = head->next;
while(p != NULL)
{
fwrite(&p->data,sizeof(DATA),1,fp);
p = p->next;
}
fclose(fp);
}
int main()
{
PNODE head = (PNODE)malloc(sizeof(NODE));
head->next = NULL;
loadData(head);
insertNode(head,getData());
saveData(head);
disPlay(head);
}
makefile:主要针对多个文件的使用,做项目要用到的内容。
双向循环链表
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *prior;
struct node *next;
};
void Add(struct node *a,struct node *new,struct node *b)
{
a->next=new;
new->next=b;
b->prior=new;
new->prior=a;
}
//头插
void T_insert(struct node *head)
{
struct node *new=(struct node *)malloc(sizeof(struct node));
printf("请输入数据(头插):");
scanf("%d",&new->data);
Add(head,new,head->next);
}
//尾插
void W_insert(struct node *head)
{
struct node *new=(struct node *)malloc(sizeof(struct node));
printf("请输入数据(尾插):");
scanf("%d",&new->data);
Add(head->prior,new,head);
}
//打印
void Print(struct node *head)
{
struct node *p=head->next;
while(p!=head)
{
printf("%d\n",p->data);
p=p->next;
}
}
//创建一条双向循环链表
struct node *Create()
{
struct node *head=(struct node *)malloc(sizeof(struct node));
head->prior=head;
head->next=head;
return head;
}
//删除,按值
void Delete(struct node *head,int data)
{
struct node *p=head->next;
for(;p!=head;p=p->next)
if(p->data==data)
{
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
}
}
void main()
{
struct node *head=Create();
T_insert(head);
T_insert(head);
T_insert(head);
W_insert(head);
Print(head);
printf("请输入要删除的值:");
int data;
scanf("%d",&data);
Delete(head,data);
Print(head);
}