链表编程
一、实验目的:
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;
}