链表

#include<stdio.h>

#include<malloc.h>

#define NULL 0

#define LENGTH sizeof(struct student)

struct student

{

 int number;

 char sex;/*M(male) or F(famal)*/

 int age;

 double score;

 struct student *next;

};

void main()

 struct student *del(struct student *del,int key);/*删除链表中key这个结点值*/

 void output(struct student *P);/*输出一个链表的函数*/

 struct student *insert(struct student *head,struct student *in);/*插入一个结点放在此链表的最后面*/

 struct student *creat(int m);/*创建一个新的链表*/

 void start();

 struct student *new_list=NULL;

 struct student plug;/*插入的结点*/

 char select;/*输入界面的先择*/

 int b=0;/*删除链表中的结点的number*/

 int s=0; /*创建链表时的结点数*/

 printf("**学生结构体包括number,sex(M or F),age,score,*p几个成员**/n");

 printf("***输入时请注意:number age 请输入整数***/n");

 printf("***score输入整数或小数/t sex输入M或F***/n");

 start();/*进入时的界面*/

 select=getchar();

 switch(select)

 {

 case 'C':

  {

   printf("请输入您想要创建的链表的结点数目:");

   scanf("%d",&s);

   new_list=creat(s);

   printf("您要创建的列表是:/n");

   output(new_list);

   break;

  }

 case 'D':

  {

  printf("请输入您想要删除的链表中结点的序号:");

  scanf("%d",&b);

  new_list=del(new_list,b);

  break;

  }

 case 'I':

  {

  printf("请输入您想插入链表中结点的学生的序号:");

  scanf("%d",&plug.number);

  printf("请输入您想插入链表中结点的学生的性别:");

  plug.sex=getchar();

  plug.sex=getchar();

  printf("请输入您想插入链表中结点的学生的年龄:");

  scanf("%d",&plug.age);

  printf("请输入您想插入链表中结点的学生的分数:");

  scanf("%lf",&plug.score);

  new_list=insert(new_list,&plug);

  printf("插入新结点后的列表为:/n");

  output(new_list);

  break;

  }

 default:

  {

   printf("您的输入有误!!/n");

  }

 }

}

struct student *creat(int m)/*建一个m个结点的链表函数*/

{

struct student *head;

struct student *temp1,*temp2;

head=NULL;

int n=0;

temp1=temp2=(struct student*) malloc(LENGTH);

printf("You will be creat a list./n");

printf("/tYou are creating the %d node./n",n+1);

printf("Please input the number:");

scanf("%d",&temp1->number);

printf("please input the sex:");

/*scanf("%c",temp1->sex);*/

temp1->sex=getchar();

/*得同时使用两个getchar(),若使用一个将一跳而过,原因可能是

因为输入前一个age时的回车读进来了*/

temp1->sex=getchar();

printf("Please input the age:");

scanf("%d",&temp1->age);

printf("Please input the score:");

scanf("%lf",&temp1->score);

while(n!=m+1)

 {

 n=n+1;

 if(n==1)/*判断是否为第一个结点,是则将head的地址指向它*/

  {

  head=temp1;

  }

 else/*不是第1个结点,则将前一个节点next指向刚新建的节点,并将temp2现次指向尾结点*/

  {

  temp2->next=temp1;

  temp2=temp1;

  temp1=(struct student*)malloc(LENGTH);

  printf("/tYou are creating the %d node./n",n);

  printf("Please input the number:");

  scanf("%d",&temp1->number);

  printf("please input the sex:");

  temp1->sex=getchar();

  temp1->sex=getchar();

  printf("Please input the age:");

  scanf("%d",&temp1->age);

  printf("Please input the score:");

  scanf("%lf",&temp1->score);

  }

 }

temp2->next=NULL;/*已建立起m个结点,将temp2指向尾节点*/

printf("you have created a list with %d node./n",m);

return(head);

}

/**************输出一个链表的函数****************/

void output(struct student *p)

{

struct student *temp;

temp=p;

printf("number /t sex /t age /t score/n");

while(temp!=NULL)

 {

 printf("%d /t %c /t %d /t %lf/n",temp->number,temp->sex,temp->age,temp->score);

 temp=temp->next;

 }

}

/**********删除链表中key这个结点值的函数***************/

struct student *del(struct student *del,int key)

{

 struct student *temp1,*temp2;

 if(del==NULL)

 {

  printf("这个链表是空的,请先建立一个链表./n");

  goto end;

 }

 temp1=del;

 while(temp1->number!=key && temp1->next!=NULL)

  /*当前值不是要删除的值,并且后面还有结点*/

  {

  temp2=temp1;temp1=temp1->next;

  /*将temp1向前移前一个结点,并将temp2指向前一个结点*/

  }

 if(temp1->number==key)/*找到要删除的结点*/

 {

  if(temp1=del)/*要删除的是头地址*/

  del=temp1->next;

  else

  temp2->next=temp1->next;

  printf("第 %d 个结点已经从链表中删除./n",key);

 }

 else

 printf("您想要删除的结点不在此链表中./n");

 end:;

return(del);

}

/************插入一个结点放在此链表的最后面的函数***************/

struct student *insert(struct student *head,struct student *in)

{

struct student *temp1,*temp2;

temp1=head;

temp2=in;

if (head==NULL)

 {

 head=temp2;

 temp2->next=NULL;

 }

else

 {

 while(temp1->next!=NULL)

  {

  //temp3=temp1;/*使temp3指向前一个结点*/

  temp1=temp1->next;/*temp1向前移一个结点*/

  }

 temp1->next=temp2;

 temp2->next=NULL;

 printf("这个节点已经插入当前链表./n");

 }

return(head);

}

/************输出开始时界面的函数*************/

void start()

{

 printf("*******************************************/n");

 printf("*/n创建一个新的链表(请按下C)/n*/n");

 printf("*******************************************/n");

 printf("*******************************************/n");

 printf("*/n删除链表中的一个结点(请按下D)/n*/n");

 printf("*******************************************/n");

 printf("*******************************************/n");

 printf("*/n在链表中插入一个新的节点(请按下I)/n*/n");

 printf("*******************************************/n");

}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值