//链表的排序,链表的添加,链表的删除,从文件中读取
一个朋友叫我帮忙写一个链表操作的,很久没有碰C数据结构了,一下子还想不起来了.哈.花了我一天多时间,搞出来这个一个东西,贴上来给有需要的朋友参考一下.写的不是很好.:)
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct add_book
{
char name[15];
char sex[4];
int age;
char add[100];
float score;
struct add_book *next; /*point to next list */
}list_entry;
int menu_select();
void print_to_screen();
int del_record(int);
int modify(int);
int swap(struct add_book *,struct add_book *);
void sort(struct add_book **);
void save();
int load();
static struct add_book *last = NULL;
struct add_book *start;
main()
{
int del_num, modify_num,com_num;
for (;;)
switch (menu_select())
{
case 1:
printf("[1]Load form files./n");
load();
break;
case 2:
printf("[2]Save to files./n");
save();
break;
case 3:
printf("[3]Add a new record./nPlease input the contant of the record!/n");
add_record();
break;
case 4:
printf("[4]Delete record!/nPlease input number of the record that you want to delete!");
printf("/nNumber:");
scanf("%d",&del_num);
del_record(del_num);
break;
case 5:
printf("[5]Modify record./nPlease input number of the record that you want to modify!");
printf("/nNumber:");
scanf("%d",&modify_num);
modify(modify_num);
break;
case 6:
printf("[5]Compositor./n");
printf("Compositor by score(Big->Small)./n.../n");
sort(&start);
break;
case 7:
print_to_screen();
break;
case 8:
exit(0);
}
}
void print_to_screen()
{
struct add_book *sign;
int i;
if (start == NULL)
{
printf("ERROR:This is a space list!/n");
return;
}
else
sign = start;
for(i=1;;i++)
if (sign != NULL)
{
printf("No.-%d-/n",i);
printf("Name:%s/n",sign->name);
printf("Sex:%s/n",sign->sex);
printf("Age:%d/n",sign->age);
printf("Address:%s/n",sign->add);
printf("Score:%f/n",sign->score);
sign = sign->next;
}
else
{
printf("=====PRINT OVER!=====/n");
break;
}
}
int add_record()
{
struct add_book *info;
for(;;)
{
info = (struct add_book *)malloc(sizeof(list_entry));
if (!info)
{
printf("/n Out of memory!");
return;
}
printf("name:");
scanf("%s",info -> name );
printf("sex:");
scanf("%s",info -> sex );
printf("age:");
scanf("%d",&info -> age );
printf("address:");
scanf("%s",info -> add );
printf("score:");
scanf("%f",&info -> score );
if (!last)
{
last = info;
last->next = NULL;
start = info; /*save start node */
}
else
{
last->next = info;
info->next = NULL;
last = info;
}
return;
}
}
int menu_select()
{
int c;
//char s[80];
printf("/n[1]Load form files./n");
printf("[2]Save to file./n");
printf("[3]Add record./n");
printf("[4]Delete record./n");
printf("[5]Modify record./n");
printf("[6]Compositor./n");
printf("[7]Print to screen./n");
printf("[8]Quit./n");
do {
printf("/nEnter your choice:");
//gets(s);
//c = atoi(s);
scanf("%d",&c);
} while ( c<1 || c>8 );
return (c);
}
int del_record(int del_num)
{
int i;
struct add_book *sign;
struct add_book *ptr_prev = NULL;
struct add_book *ptr = NULL;
if (start == NULL)
{
printf("ERROR:This is a space list!/n");
return 0;
}
else
sign = start;
for (i=1;i<=del_num;i++)
{
if ( sign != NULL )
{
if ( i == (del_num-1) )
ptr_prev = sign;
if (i == del_num)
ptr = sign;
sign = sign->next;
}
else
{
printf("The record you select is not exist!/n");
return 0;
}
}
if (ptr_prev != NULL && ptr->next != NULL)
ptr_prev->next = ptr->next;
if (ptr_prev == NULL)
start = ptr->next;
if (ptr->next == NULL && ptr_prev != NULL)
{
last = ptr_prev;
ptr_prev->next = NULL;
}
if (ptr->next == NULL && ptr_prev == NULL)
last = ptr_prev;
free(ptr);
printf("/n=====Record Deleted!=====/n");
return 0;
}
int modify(int modify_num)
{
int i;
struct add_book *sign;
struct add_book *ptr = NULL;
if (start == NULL)
{
printf("ERROR:This is a space list!/n");
return 0;
}
else
sign = start;
for (i=1;i<=modify_num;i++)
{
if ( sign != NULL )
{
if (i == modify_num)
ptr = sign;
sign = sign->next;
}
else
{
printf("The record you select is not exist!/n");
return 0;
}
}
printf("=====BEGIN MODIFY!=====/n");
printf("name:[%s]/n -> ",ptr->name);
scanf("%s",ptr -> name );
printf("sex:[%s]/n -> ",ptr->sex);
scanf("%s",ptr -> sex );
printf("age:[%d]/n -> ",ptr->age);
scanf("%d",&ptr -> age );
printf("address:[%s]/n -> ",ptr->add);
scanf("%s",ptr -> add );
printf("score:[%f]/n -> ",ptr->score);
scanf("%f",&ptr -> score );
printf("=====MODIFY SUCCESSFUL!=====/n");
return 0;
}
void sort(struct add_book **h)//hÓÃÓÚÖ¸Ïò Ö¸ÏòÁ´±íÍ·µÄÖ¸Õë µÄÖ¸Õë
{
struct add_book *h1,*p,*q,*r,*s;
h1=p=(struct add_book *)malloc(sizeof(list_entry));
p->next=*h;
while(p->next) {
q=p->next;
r=p;
while(q->next) {
if(q->next->score > r->next->score)
r=q;
q=q->next;
}
if(r!=p) {
s=r->next;
r->next=s->next;
s->next=p->next;
p->next=s;
}
p=p->next;
}
*h=h1->next;
free(h1);
}
void save()
{
FILE *ptr;
struct add_book *sign;
sign = start;
ptr = fopen("c://erikxu.txt", "w");
while(sign != NULL) /* Get data from stdin */
{
fprintf(ptr, "%s/n", sign->name); /* Send data to file. */
fprintf(ptr, "%s/n", sign->sex);
fprintf(ptr, "%d/n", sign->age);
fprintf(ptr, "%s/n", sign->add);
fprintf(ptr, "%f/n", sign->score);
sign = sign->next;
}
fclose(ptr);
}
int load()
{
FILE *ptr;
struct add_book *sign, *new_start,*temp,*start_bak;
char name_temp[15];
int i=1;
ptr = fopen("c://erikxu.txt", "rb");
if (ptr == NULL)
return 0;
while(fscanf(ptr, "%s", name_temp) != EOF) /* Get data from stdin */
{
temp=(struct add_book *)malloc(sizeof(list_entry));
if (!temp)
{
printf("Error:out of memory!");
return 0;
}
/* Send data to file. */
strcpy(temp->name ,name_temp);
fscanf(ptr, "%s", temp->sex);
fscanf(ptr, "%d", &temp->age);
fscanf(ptr, "%s", temp->add);
fscanf(ptr, "%f", &temp->score);
if (i==1)
{
new_start = temp;
sign=temp;
}
else
{
sign->next = temp;
sign=sign->next;
}
i++;
}
fclose(ptr);
temp->next = NULL;
start_bak=start;
while (start_bak!=NULL)
{
sign=start_bak;
start_bak=start_bak->next;
free(sign);
}
start = new_start;
last = temp;
}