链表的基本操作

链表的基本操作包括建立链表、链表的插入、删除、输出和查找等。

#include<stdlib.h>
#include
<stdio.h>
#include
<conio.h>
#include
<ctype.h>
#define NULL 0
#define LEN sizeof(struct student)

extern unsigned _floatconvert;    /*防止floating point formats not linked 错误发生*/
#pragma extref _floatconvert

typedef 
struct student    
{
    
long num;
    
float score;
    
struct student *next;
}STU;

int n;

STU 
*CreateEnd()
{
    STU 
*p1,*p2,*head;
    n
=0;head=NULL;
    p1
=(STU *)malloc(LEN);        /*创建第一个结点*/
    scanf(
"%ld,%f",&p1->num,&p1->score);
    p1
->next=NULL;
    
while(p1->num!=0)        /*将结点加入链表*/
    {
        
++n;
        
if(n==1)        /*是第一个结点,作表头*/
            head
=p1;
        
else            /*不是第一个结点,作表尾*/
            p2
->next=p1;
        p2
=p1;
        p1
=(STU *)malloc(LEN);    /*开辟下一个结点*/
        scanf(
"%ld,%f",&p1->num,&p1->score);
        p1
->next=NULL;
    }
    free(p1);            
/*释放最后一个结点所占的内存*/
    
return (head);            /*返回链表的头指针*/
}
STU 
*CreateStart()
{
    STU 
*head,*p;
    n
=0;
    head
=NULL;
    p
=(STU *)malloc(LEN);
    scanf(
"%ld,%f",&p->num,&p->score);
    p
->next=head;
    
while(p->num!=0)
    {
        
++n;
        head
=p;
        p
=(STU *)malloc(LEN);
        scanf(
"%ld,%f",&p->num,&p->score);
        p
->next=head;
    }
    free(p);
    
return (head);
}
void print(STU *head)
{
    STU 
*p;
    printf(
"\nNow,These %d nodes are :\n",n);
    p
=head;
    
do
    {
        printf(
"%ld\t%5.1f\n",p->num,p->score);
        p
=p->next;
    }
while(p!=NULL);
}

STU 
*insert(STU *head,STU *stud)
{
    STU 
*p0,*p1,*p2;
    p1
=head;            /*p1指向第一个结点*/
    p0
=stud;            /*p0指向要插入的结点*/
    
if(head==NULL)            /*原来是空表*/
    {head
=p0;p0->next=NULL;}    /*使p0指向的结点作为链表第一个结点*/
    
else
    {
        
while((p0->num>p1->num)&&(p1!=NULL))
        {p2
=p1;p1=p1->next;}    /*找插入点*/
        
if(head==p1)        /*作为表头*/
        {p0
->next=head;head=p0;}
        
else            /*插到p2指向的结点之后*/
        {p2
->next=p0;p0->next=p1;}
    }
    
++n;
    
return head;
}

STU 
*del(STU *head,long num)
{
  STU 
*p1,*p2;
  
if(head==NULL)
  {printf(
"\nList null!\n");goto end;}        /*链表为空*/
  p1
=head;                    /*从头结点开始查找*/
  
while(num!=p1->num && p1!=NULL)        /*p1指向的不是所要找的结点,并且没有到表尾*/
  {p2
=p1;p1=p1->next;}                /*后移一个结点*/
  
if(num==p1->num)                /*找到需要删除的结点*/
  {
    
if(p1==head)                /*p1指向的是头结点*/
      head
=p1->next;            /*第二个结点成为新的头结点*/
    
else
      p2
->next=p1->next;            /*后继结点的地址赋给前一结点*/
    printf(
"delete:%ld\n",num);
    free(p1);
    n
--;
  }
  
else
    printf(
"%ld not been found!\n",num);
end:
  
return head;
}
STU 
*find(STU *head,long num)
{
  STU 
*p1,*p2;
  
if(head==NULL)
  {printf(
"\nlist null!\n");goto end;}
  p1
=head;
  
while(num!=p1->num && p1!=NULL)
  {p2
=p1;p1=p1->next;}
  
if(p1!=NULL)
    printf(
"find:%ld %5.1f\n",num,p1->score);
  
else
    printf(
"%ld not been found!\n",num);
end:
  
return head;
}
void main()
{
    STU 
*head,*stu;
    
long find_num,del_num;
    
char letter;
    head
=CreateEnd();
    
//head=CreateStart();
    print(head);

    
do
    {
        printf(
"A Insert student information\n");
        printf(
"B Find student information\n");
        printf(
"C Delete student information\n");
        printf(
"Q Quit\n");
        printf(
"Please select: \n");

        letter 
= getch();
        letter 
= toupper(letter);

        
switch (letter)
        {
        
case 'A':
            printf(
"Please input the information of student:\n");
            stu
=(STU *)malloc(LEN);
            scanf(
"%d,%f",&stu->num,&stu->score);
            head
=insert(head,stu);
            print(head);
            
break;
        
case 'B':
            printf(
"Please input the find number:\n");
            scanf(
"%ld",&find_num);
            head
=find(head,find_num);
            print(head);
            
break;
        
case 'C':
            printf(
"Please input the delete number:\n");
            scanf(
"%ld",&del_num);
            head
=del(head,del_num);
            print(head);
            
break;
        }
    }
while (letter != 'Q');
    getch();
}
posted @ 2007-05-01 20:57  齐心  Views(961)  Comments(0Edit  收藏  举报