简单的单链表操作

//链表的排序,链表的添加,链表的删除,从文件中读取
一个朋友叫我帮忙写一个链表操作的,很久没有碰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;


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值