一.实验目的:
1.掌握指针与内存地址的关系
2.掌握通过指针动态申请和释放内存的编程方法
3.学习和掌握单向链表的基本操作
二、实验内容和步骤 |
1.分析并修改下面程序错误,使之能够正常运行。
错误代码一:
输入若干学生的信息(学号、姓名、成绩),当输入学号为 0 时结束,用单向链表组织这些学生信息后,再按序输出。
#include
#include
#include
structstud_node
{
intnum;
char name[20];
int score;
structstud_node *next;
};
int main()
{
structstud_node *head,*tail,*p;
intnum,score;
char name[20];
int size = sizeof(structstud_node);
head=tail=NULL;
printf(“input num,name and score:\n”);
scanf(“%d”,&num);
while(num != 0)
{
p=malloc(size);
scanf(“%s%d”,name,&score);
p->num=num;
strcpy(p->name,name);
p->score=score;
p->next=NULL;
tail->next=p;
tail=p;
scanf(“%d”,&num);
}
for(p=head;p->next != NULL;p=p->next)
printf(“%d %s %d\n”,p->num,p->name,p->score);
return 0;
}
正确代码:
#include
#include
#include
struct stud_node
{
int number;
char name[20];
int score;
struct stud_node *next;
};
int main()
{
struct stud_node*head,*tail,*p;
int num,scor,cnt=0;
char name[20];
int size = sizeof(structstud_node);
head=(struct stud_node*)malloc(size);
printf("input num:\n");
scanf("%d",&num);
while(num != 0)
{
cnt++;
printf("inputname and score:\n");
scanf("%s%d",name,&scor);
p=(struct stud_node*)malloc(size);
p->number=num;
strcpy(p->name,name);
p->score=scor;
if(cnt==1)
{
head->next=p;
tail=p;
}
else
{
tail->next=p;
tail=p;
}
printf("\ninputnum:\n");
scanf("%d",&num);
}
tail->next=NULL;
p=head->next;
printf("\nThestudents' massage:\n");
while(p!=NULL)
{
printf("%d %s %d\n",p->number,p->name,p->score);
p=p->next;
}
return 0;
}
2. 编写程序实现以下功能
简单有序链表的创建和查询修改
(1)建立一个单链表 21 3 15 27 11 18,并输出该链表;
(2)输入序号n,查找序号为n的结点,并输出;
(3)输入值x,查找值为x的结点,并输出;
(4)插入结点: 输入序号 n和值x。在序号为n的结点后插入x,并输出该链表;
(5)删除结点: 输入序号 n,册除序号为 n 的结点,并输出该链表。
代码:
#include
#include
#include
#define lis struct list*
#define setup malloc(sizeof(lis))
struct list
{
int n,x;
lis next;
};
int i,len=6;
lis p;
lis t;
lis generate()
{
lis head;
lis tail;
for(i=1;i<=len;i++)
{
p=setup;
p->n=i;
printf("Input %d number's price:\n",i);
scanf("%d",&p->x);
if(i==1)
{
head=tail=p;
}
else
{
tail->next=p;
tail=p;
}
}
tail->next=NULL;
return(head);
}
void search_n(lis head)
{
intnn,flag=0;
printf("Please input n:\n");
scanf("%d",&nn);
p=head;
while(p!=NULL)
{
if(p->n==nn)
{
printf("%d %d\n",p->n,p->x);
flag=1;
}
p=p->next;
}
if(!flag)
printf("Not find %d number's node.\n",nn);
}
void search_x(lis head0)
{
intxx,flag=0;
printf("Please input x:\n");
scanf("%d",&xx);
p=head0;
while(p!=NULL)
{
if(p->x==xx)
{
printf("%d %d\n",p->n,p->x);
flag=1;
}
p=p->next;
}
if(!flag)
printf("Not find %d price of node.\n",xx);
}
lis insert(lis head1)
{
int n,x;
printf("Please input n and x:\n");
scanf("%d%d",&n,&x);
lis k=setup;
k->n=n;
k->x=x;
p=head1;
while(p->n!=n)
{
p=p->next;
}
if(p->next!=NULL)
{
t=p->next;
p->next=k;
k->next=t;
}
else
{
p->next=k;
k->next=NULL;
}
return(head1);
}
lis delet(lis head2)
{
int n;
printf("Please input n to delete the node:\n");
scanf("%d",&n);
p=head2;
while(p!=NULL)
{
if(p->n==n)
{
p=p->next;
t->next=p;
}
t=p;
p=p->next;
}
return(head2);
}
void output(lis head)
{
printf("The current list:\n");
p=head;
while(p!=NULL)
{
printf("%d %d\n",p->n,p->x);
p=p->next;
}
}
int main()
{
lisa=generate();
output(a);
search_n(a);
search_x(a);
output(insert(a));
output(delet(a));
return 0;
}