Chinaunix首页 | 论坛 | 博客
  • 博客访问: 394220
  • 博文数量: 105
  • 博客积分: 4100
  • 博客等级: 上校
  • 技术积分: 1040
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-27 19:57
文章存档

2012年(1)

2011年(9)

2010年(4)

2009年(25)

2008年(66)

我的朋友

分类: C/C++

2008-07-27 20:52:40

链表中建立,删除,插入操作
 
/*学生结构体包括number,sex,age,score,*p几个成员*/
#include
#include
#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");
}

阅读(1023) | 评论(0) | 转发(0) |
0

上一篇:字符串的排序

下一篇:C++ volatile用法

给主人留下些什么吧!~~