本帖最后由 q672730275 于 2015-2-19 19:04 编辑
/*关于单项链表的问题*/
#include<stdio.h> //建立一个单项链表的学生信息
#include<stdlib.h>
struct stu //学生信息的结构体
{int num;
char name[20];
float score;
struct stu *next;
};
void main() //主函数
{
struct stu *creat(); //建立链表的函数
struct stu *delet(struct stu *head,int key);//删除链表的某一节点
struct stu *insert(struct stu *head,struct stu *s);//插入某一节点的函数
void output(struct stu *); //输出链表的信息
struct stu *head,*s;
int key;
printf("建立学生档案\n");
head=creat();
output(head);printf("\n");
printf("删除学生档案\n");
scanf("%d",&key);
head=delet(head,key);
output(head);
printf("\n");
printf("插入学生成绩\n");
s=(struct stu*)malloc(sizeof(struct stu));
scanf("%d%s%f",&s->num,s->name,&s->score);
head=insert(head,s);
output(head);
}
struct stu *creat() //创建链表的函数体
{
struct stu *head,*last,*p;
int num;
head=last=NULL;
printf("please input num name score:\n");
scanf("%d",&num);
while(num>0)
{
p=(struct stu*) malloc(sizeof(struct stu));
p->num=num;p->next=NULL;
scanf("%s%f",p->name,&p->score);
if(head==NULL)
head=p;
else
last->next=p;
last=p;
printf("please int num name:\n");
scanf("%d",&num);
}
return(head);
}
void output(struct stu * head) //输出链表的函数体
{
struct stu *p;
if(head!=NULL) //判断是否为空链表
{
printf ("学生记录为:");
p=head;
while(p!=NULL) //输出学生信息
{
printf("学号: %d 姓名: %s 成绩:%.2f \n",p->num,p->name,p->score);
p=p->next;
}
}
else printf("空链表");
}
struct stu * delet(struct stu *head,int key) //删除链表的函数体
{
struct stu *p1,*p2; //建立两个结构体指针
if(head!=NULL) //判断是否为空链表
{
p1=head;
while(p1->num!=key&&p1->next!=NULL) //查找要删除的节点的位置
{
{
p2=p1;
p1=p1->next;
}
if(p1->num==key) //判断节点位置的情况(调试程序是这里出了问题,其他都没问题,希望各位帮忙看一下)
{
if(p1==head) //判断节点是否为链表头
head=p1->next;
else
p2->next=p1->next; //进行节点的删除
free(p1); //释放内存
}
else
printf("没有找到要删除的点\n");
}
}
else printf("空链表!\n");
return head;
}
struct stu *insert(struct stu *head,struct stu *s) //插入节点的函数体
{
struct stu *p1,*p2;
p1=head;
if(p1==NULL)
{head=s;head->next=NULL;}
else
{ while((s->num>p1->num)&&(p1->next!=NULL))
{p2=p1;
p1=p1->next;}
if(s->num<=p1->num)
{if(head==p1)
head=s;
else
p2->next=s;
s->next=p1;
}
else{p1->next=s;
s->next=NULL;
}
}
return head;
}
|