现在的位置: 首页 > 综合 > 正文

c 单链表的创建、插入、删除、倒置操作

2013年10月03日 ⁄ 综合 ⁄ 共 3683字 ⁄ 字号 评论关闭
/*-----------------------------------------------------*/
/*--------------单链表的创建、插入、删除、倒置操作-----------*/
/*-----------------------------------------------------*/
#include<malloc.h>
#include<stdio.h>
#define null 0
struct student
{
       long Number;
       char Name[20];
       long Score;
       struct student *Next;
};
 
int n=0;/*n为全局变量,用来计算链表的结点个数*/
 
 
 
/*-----------------------------------------*/
/*--------------创建结点函数Creat()--------*/
/*-----------------------------------------*/
struct student *Creat()
{
 
       struct student *p1;
       struct student *p2;
       struct student *head=null;
       p1=p2=(struct student *)malloc(sizeof(struct student));/*开辟一段可用内存单元*/
       printf("please input the student's Number Name and the Score:/n");
       scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);
 
       while(p2->Number!=0)
       {
              n++;
 
              if(n==1)            /*是否开辟的是第一个结点*/
              head=p2;
              else
              p1->Next=p2;
 
              p1=p2;
              p2=(struct student *)malloc(sizeof(struct student));
              printf("Input the Number the Name and the Score:/n");
              scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);
       }
       p1->Next=null;
       return(head);
}
 
 
/*------------------------------------------*/
/*--------------查看链表内容函数View()------*/
/*------------------------------------------*/
 View(struct student *head)
 {
       struct student *p;
       p=head;
       while(p->Next!=null)
       {
       printf("%ld %s %ld/n",p->Number,p->Name,p->Score);
       p=p->Next;
       }
       printf("%ld %s %ld/n",p->Number,p->Name,p->Score);
 }
 
/*-------------------------------------------------*/
/*--------------插入结点函数(前插)Insert()-------*/
/*-------------------------------------------------*/
 Insert(struct student *head,int Num)       /*head为链表头指针,Num插入链表位置*/
{
       int t=1;
       struct student *p1,*p2;
       p1=head;
       if (Num>n||Num<0)
       {
              printf("input error!!!/n");
              return 0;
       }
 
       while(t<Num-1)                  /*找到要插入结点的前一个结点*/
       {
              p1=p1->Next;
              t++;
       }
 
       p2=(struct student *)malloc(sizeof(struct student));
       printf("Input the Number the Name and the Score:/n");
       scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);
       p2->Next=p1->Next;
       p1->Next=p2;
 
       n++;
 
}
 
 
/*------------------------------------------*/
/*------------ 删除结点函数Delnode()--------*/
/*-----------------------------------------*/
 Delnode(struct student *head,int node)
{
       int t=1;
       struct student *p1,*p2;
       p2=head;
       if (node>n||node<1)
       {
              printf("error!!! The node is not exist!");
              return 0;
       }
       while(t<node-1)       /*找到要删除结点的前一个结点*/
       {
              p2=p2->Next;
              t++;
       }
       p1=p2->Next->Next;     /*找到要删除结点的后一个结点*/
       free(p2->Next);        /*释放要删除的结点空间(删除)*/
       p2->Next=p1;           /*前一结点指向后一结点*/
       n--;         
}
 
/*-------------------------------------------------*/
/*--------------逆序重组链表Invert()-------*/
/*-------------------------------------------------*/
 struct student *Invert(struct student *head)
{
       struct student *p1,*p2;
       p1=head;
       p2=p1->Next;
       head=p2->Next;
       p1->Next=null;
       while(head->Next!=null)
       {
              p2->Next=p1;
              p1=p2;
              p2=head;
              head=head->Next;
       }
       head->Next=p2;
       p2->Next=p1;
       return head;
}
 
main()
{
       int number1,number2;
       struct student *head;
       head=Creat();
       View(head);
 
       printf("the n that you want to insert:/n");
       scanf("%d",&number1);
       Insert(head,number1);
       View(head);
 
       printf("the node that you want to DELETE:/n");
       scanf("%d",&number2);
       Delnode(head,number2);
       View(head);
 
       printf("Inverte the list:/n");
       View(Invert(head));
 
       getch();
}

抱歉!评论已关闭.