链表的简单操作

来源:互联网 发布:qq免费字体软件 编辑:程序博客网 时间:2024/05/22 03:02

链表编程
一、实验目的:
1.掌握建立链表中指针的运用、插入删除节点的方法;
二、实验准备:
1.复习链表的概念;建立链表的过程;链表节点的插入与删除;
2.预习实验内容,并在预习报告上写出程序流程图(或源代码);
3.上机输入源程序,调试运行并记录运行结果;
4.将源程序存在自己的U盘上,课后按要求写实验报告。
三、实验内容:
【编写程序】:编写函数,实现以下有关链表的各项功能
1.通过输入建立一个只有6个结点的单链表,并输出该链表;
2.输入序号n,查找序号为n的结点,并输出;
4.输入值x,查找值为x的结点,并输出;
5.插入结点: 输入序号n和值x。在序号为n的结点后插入x,并输出该链表;
6.删除结点: 输入序号n,删除序号为n的结点,并输出该链表。
     程序运行结果:
该链表为:21  23  25  27  29  31
输入序号:3
输出值为:25
 
输 入 值:29
输出序号:5
 
插入结点位置:3
插入结点数值:26
输出链表:21  23  25  26  27  29  31
 
删除结点:3
输出链表:21  23  26  27  29  31


 
 
 
 
 
#include<stdio.h>
struct Num{
 int num;
 struct Num *next;
};
struct Num *Crete_num()
{
 int num;
 int size=sizeof(struct Num);
 struct Num *head,*tail,*p;
 head=NULL;
 tail=NULL;
 printf("请输入链表:\n");
 scanf("%d",&num);
 while(num!=0)
 {
   p=(struct Num *) malloc(size);
   p->num=num;
   p->next=NULL;
   if(head==NULL)
    head=p;
   else
    tail->next=p;
   tail=p;
   scanf("%d",&num);
 }
 return head;
}
void Sort1(struct Num *head)
{
 int n,temp=0;
 struct Num *ptr;
 printf("\n\n输入序号: ");
 scanf("%d",&n);
 for(ptr=head;ptr;ptr=ptr->next)
    {  
     temp+=1;
        if(temp==n)
      printf("输出值为: %d \n\n",ptr->num);
    }
}
void Sort2(struct Num *head)
{
 int z,temp=0;
 struct Num *ptr;
 printf("输入值:   ");
 scanf("%d",&z);
 temp=0;
 for(ptr=head;ptr;ptr=ptr->next)
    {  
     temp+=1;
        if(ptr->num==z)
      printf("输出序号:  %d \n",temp);
    }
}
struct Num *Insert(struct Num *head)
{
 int n,temp=0;
 struct Num *p,*ptr,*ptr1,*t;
 p=(struct Num *) malloc(sizeof(struct Num));
  
 printf("\n插入结点位置: ");
 scanf("%d",&n);
 printf("插入结点数值: ");
 scanf("%d",&p->num);
 if(head==NULL)
 {
  head=p;
  head->next=NULL;
 }
 else
 {
  for(ptr=head;ptr;ptr=ptr->next)
         {  
          temp+=1;
             if(temp==n)
    {
       t=ptr->next;
       ptr->next=p;
       p->next=t;
       break;
    }
    
               
         }
 }
 
 printf("输出链表: ");
 for(ptr1=head;ptr1;ptr1=ptr1->next)
  printf(" %d ",ptr1->num);
 return head;


}


struct Num *Delete(struct Num *head)
{
 int n,temp=0,data;
 struct Num *p,*ptr,*ptr1,*ptr2,*ptr3;
 printf("\n\n删除结点:");
 scanf("%d",&n);
 for(p=head;p;p=p->next)
       {  
        temp+=1;
     if(temp==n)
     {
      data=p->num ;
         break;
     }
        }
 while(head!=NULL&&head->num ==data)
 {
  ptr2=head;
     head=head->next;
     free(ptr2);
 }
 if(head==NULL)
  return NULL;
 ptr1=head;
 ptr2=head->next;
 while(ptr2!=NULL)
 {
  if(ptr2->num==data)
  {
   ptr1->next=ptr2->next;
      free(ptr2);
  }
     else
     ptr1=ptr2;
     ptr2=ptr1->next;
 }
 
 
 printf("输出链表: ");
 for(ptr1=head;ptr1;ptr1=ptr1->next)
  printf(" %d ",ptr1->num);
 printf("\n\n");


 
 
}
 
 
int main()
{
 struct Num *head;
    struct Num *ptr;
 
 head=Crete_num();
 printf("\n该链表为: ");
 for(ptr=head;ptr;ptr=ptr->next)
  printf(" %d ",ptr->num);
  
 Sort1(head);
 Sort2(head);
 Insert(head);
 Delete(head);


 return 0;
}

原创粉丝点击