#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct student
{
long id;
char name[32];
char sex[8];
int age;
float math;
struct student *next;
}stu,*pstu;
stu *head;//全局指针变量默认初始化为NULL
stu *frontadd(stu *head);
stu *rearadd(stu *head);
stu *add(stu *head);
stu *delete(stu *head);
void print_list(stu *head);
void free_list(stu *head);
int main()
{
int sel=0;
char ch;
while(1)
{
printf("\t1:前插法添加节点\n\t2:后插法添加节点\n\t3:添加顺序节点\n\t4:删除节点\n\t5:查看链表\n\t6:退出\n");
printf("请输入选项:\n");
scanf("%d",&sel);
printf("%d\n",sel);
//sleep(2);
ch=getchar();//取出回车,避免循环
//printf("%c\n",ch);
switch(sel)
{
case 1:
head=frontadd(head);
break;
case 2:
head=rearadd(head);
break;
case 3:
head=add(head);
break;
case 4:
head=delete(head);
break;
case 5:
print_list(head);
break;
case 6:
//退出前释放内存
free_list(head);
exit(0);
default:
printf("reinput 1-6\n");
}
}
return 0;
}
stu *frontadd(stu *head)
{
stu *s=NULL;
//stu *p=NULL;
char judge;
while(1)
{
s=(stu *)malloc(sizeof(stu));
s->next=NULL;
printf("请输入学号:\n");
scanf("%ld",&s->id);
printf("请输入姓名:\n");
scanf("%s",s->name);
printf("请输入性别:\n");
scanf("%s",s->sex);
printf("请输入年龄:\n");
scanf("%d",&s->age);
printf("请输入数学成绩:\n");
scanf("%f",&s->math);
s->next=head;
head=s;
while(getchar()!='\n');
printf("是否继续添加?(y/n)");
judge=getchar();
if(judge=='y')
{
continue;
}
else
{
break;
}
}
return head;
}
stu *rearadd(stu *head)
{
stu *s=NULL;
stu *p=NULL;
stu *q=NULL;
char judge;
while(1)
{
s=(stu *)malloc(sizeof(stu));
s->next=NULL;
printf("请输入学号:\n");
scanf("%ld",&s->id);
printf("请输入姓名:\n");
scanf("%s",s->name);
printf("请输入性别:\n");
scanf("%s",s->sex);
printf("请输入年龄:\n");
scanf("%d",&s->age);
printf("请输入数学成绩:\n");
scanf("%f",&s->math);
//添加节点
if(NULL==head)
{
head=s;
}
else
{
p=head;
while(p!=NULL)
{
q=p;
p=p->next;
}
q->next=s;
}
while(getchar()!='\n');
printf("是否继续添加?(y/n)");
judge=getchar();
if(judge=='y')
{
continue;
}
else
{
break;
}
}
return head;
}
stu *add(stu *head)
{
stu *s=NULL;
stu *p=NULL;
stu *q=NULL;
char judge;
while(1)
{
s=(stu *)malloc(sizeof(stu));
s->next=NULL;
printf("请输入学号:\n");
scanf("%ld",&s->id);
printf("请输入姓名:\n");
scanf("%s",s->name);
printf("请输入性别:\n");
scanf("%s",s->sex);
printf("请输入年龄:\n");
scanf("%d",&s->age);
printf("请输入数学成绩:\n");
scanf("%f",&s->math);
//添加节点
if(NULL==head)
{
head=s;
}
else
{
if(s->id<head->id)
{
s->next=head;
head=s;
}
else
{
p=head;//每次查找都需要从链表头开始
while((p!=NULL)&&(s->id>p->id))
{
q=p;
p=p->next;
}
q->next=s;
s->next=p;
}
}
while(getchar()!='\n');
printf("是否继续添加?(y/n)");
judge=getchar();
if(judge=='y')
{
continue;
}
else
{
break;
}
}
return head;
}
stu *delete(stu *head)
{
if(NULL==head)
{
printf("list empty\n");
return NULL;
}
char judge;
stu *p=NULL;
stu *q=NULL;
long num=0;
while(1)
{
printf("请输入删除的节点数据:\n");
scanf("%ld",&num);
p=head;
if(NULL==head)
{
printf("list empty\n");
return NULL;
}
if(head->id==num)
{
p=head;
head=head->next;
free(p);
p=NULL;
}
else
{
while((p!=NULL)&&(p->id!=num))
{
q=p;
p=p->next;
}
if(NULL==p)
{
printf("%ld not in list\n",num);
break;
}
else
{
q->next=p->next;
free(p);
p=NULL;
}
}
while(getchar()!='\n');
printf("是否继续删除(y/n):");
judge=getchar();
if(judge=='y')
{
continue;
}
else
{
break;
}
}
return head;
}
void print_list(stu *head)
{
if(NULL==head)
{
printf("list empty\n");
return;
}
stu *p=NULL;
p=head;
printf("学号 姓名 性别 年龄 数学\n");
while(p!=NULL)
{
printf("%ld %s %s %d %.2f\n",p->id,p->name,p->sex,p->age,p->math);
p=p->next;
}
return;
}
void free_list(stu *head)
{
if(NULL==head)
{
printf("list empty\n");
return;
}
stu *p=NULL;
stu *q=NULL;
p=head;
while(p!=NULL)
{
q=p;//p指针移动之前先保存起来
p=p->next;
free(q);
q=NULL;
}
head=NULL;
}
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
typedef struct student
{
long id;
char name[32];
char sex[8];
int age;
float math;
struct student *next;
}stu,*pstu;
stu *head;//全局指针变量默认初始化为NULL
stu *frontadd(stu *head);
stu *rearadd(stu *head);
stu *add(stu *head);
stu *delete(stu *head);
void print_list(stu *head);
void free_list(stu *head);
int main()
{
int sel=0;
char ch;
while(1)
{
printf("\t1:前插法添加节点\n\t2:后插法添加节点\n\t3:添加顺序节点\n\t4:删除节点\n\t5:查看链表\n\t6:退出\n");
printf("请输入选项:\n");
scanf("%d",&sel);
printf("%d\n",sel);
//sleep(2);
ch=getchar();//取出回车,避免循环
//printf("%c\n",ch);
switch(sel)
{
case 1:
head=frontadd(head);
break;
case 2:
head=rearadd(head);
break;
case 3:
head=add(head);
break;
case 4:
head=delete(head);
break;
case 5:
print_list(head);
break;
case 6:
//退出前释放内存
free_list(head);
exit(0);
default:
printf("reinput 1-6\n");
}
}
return 0;
}
stu *frontadd(stu *head)
{
stu *s=NULL;
//stu *p=NULL;
char judge;
while(1)
{
s=(stu *)malloc(sizeof(stu));
s->next=NULL;
printf("请输入学号:\n");
scanf("%ld",&s->id);
printf("请输入姓名:\n");
scanf("%s",s->name);
printf("请输入性别:\n");
scanf("%s",s->sex);
printf("请输入年龄:\n");
scanf("%d",&s->age);
printf("请输入数学成绩:\n");
scanf("%f",&s->math);
s->next=head;
head=s;
while(getchar()!='\n');
printf("是否继续添加?(y/n)");
judge=getchar();
if(judge=='y')
{
continue;
}
else
{
break;
}
}
return head;
}
stu *rearadd(stu *head)
{
stu *s=NULL;
stu *p=NULL;
stu *q=NULL;
char judge;
while(1)
{
s=(stu *)malloc(sizeof(stu));
s->next=NULL;
printf("请输入学号:\n");
scanf("%ld",&s->id);
printf("请输入姓名:\n");
scanf("%s",s->name);
printf("请输入性别:\n");
scanf("%s",s->sex);
printf("请输入年龄:\n");
scanf("%d",&s->age);
printf("请输入数学成绩:\n");
scanf("%f",&s->math);
//添加节点
if(NULL==head)
{
head=s;
}
else
{
p=head;
while(p!=NULL)
{
q=p;
p=p->next;
}
q->next=s;
}
while(getchar()!='\n');
printf("是否继续添加?(y/n)");
judge=getchar();
if(judge=='y')
{
continue;
}
else
{
break;
}
}
return head;
}
stu *add(stu *head)
{
stu *s=NULL;
stu *p=NULL;
stu *q=NULL;
char judge;
while(1)
{
s=(stu *)malloc(sizeof(stu));
s->next=NULL;
printf("请输入学号:\n");
scanf("%ld",&s->id);
printf("请输入姓名:\n");
scanf("%s",s->name);
printf("请输入性别:\n");
scanf("%s",s->sex);
printf("请输入年龄:\n");
scanf("%d",&s->age);
printf("请输入数学成绩:\n");
scanf("%f",&s->math);
//添加节点
if(NULL==head)
{
head=s;
}
else
{
if(s->id<head->id)
{
s->next=head;
head=s;
}
else
{
p=head;//每次查找都需要从链表头开始
while((p!=NULL)&&(s->id>p->id))
{
q=p;
p=p->next;
}
q->next=s;
s->next=p;
}
}
while(getchar()!='\n');
printf("是否继续添加?(y/n)");
judge=getchar();
if(judge=='y')
{
continue;
}
else
{
break;
}
}
return head;
}
stu *delete(stu *head)
{
if(NULL==head)
{
printf("list empty\n");
return NULL;
}
char judge;
stu *p=NULL;
stu *q=NULL;
long num=0;
while(1)
{
printf("请输入删除的节点数据:\n");
scanf("%ld",&num);
p=head;
if(NULL==head)
{
printf("list empty\n");
return NULL;
}
if(head->id==num)
{
p=head;
head=head->next;
free(p);
p=NULL;
}
else
{
while((p!=NULL)&&(p->id!=num))
{
q=p;
p=p->next;
}
if(NULL==p)
{
printf("%ld not in list\n",num);
break;
}
else
{
q->next=p->next;
free(p);
p=NULL;
}
}
while(getchar()!='\n');
printf("是否继续删除(y/n):");
judge=getchar();
if(judge=='y')
{
continue;
}
else
{
break;
}
}
return head;
}
void print_list(stu *head)
{
if(NULL==head)
{
printf("list empty\n");
return;
}
stu *p=NULL;
p=head;
printf("学号 姓名 性别 年龄 数学\n");
while(p!=NULL)
{
printf("%ld %s %s %d %.2f\n",p->id,p->name,p->sex,p->age,p->math);
p=p->next;
}
return;
}
void free_list(stu *head)
{
if(NULL==head)
{
printf("list empty\n");
return;
}
stu *p=NULL;
stu *q=NULL;
p=head;
while(p!=NULL)
{
q=p;//p指针移动之前先保存起来
p=p->next;
free(q);
q=NULL;
}
head=NULL;
}