完成单链表操作,要求节点构造类型。
1、建立学生结构体(学号,姓名,成绩)
2、循环调用头插法创建整表
3、遍历单链表
4、任意位置插入一个完整的学生信息
5、任意位置删除一个学生。
6、单链表逆置
7、单链表按照学生成绩排序。
#include <myhead.h>
typedef struct
{
int id;
char name[20];
int score;
}stu;
typedef struct node
{
union{
int len;
stu data;
};
struct node *next;
}Link,*Plink;
Plink create()
{
Plink p=malloc(sizeof(Link));
if(p==NULL)
{
printf("申请失败\n");
return NULL;
}
p->len=0;
p->next=NULL;
return p;
}
int front_insert(Plink L,stu e)
{
if(L==NULL)
{
printf("头插失败\n");
return -1;
}
Plink p=malloc(sizeof(Link));
p->data=e;
p->next=L->next;
L->next=p;
L->len++;
return 0;
}
int input(stu a[])
{
int i;
for(i=0;i<5;i++)
{
printf("请输入学号:");
scanf("%d",&a[i].id);
printf("请输入姓名:");
scanf("%s",a[i].name);
printf("请输入分数:");
scanf("%d",&a[i].score);
}
}
int output_link(Plink L)
{
if(L==NULL||L->len==0)
{
printf("链表为空\n");
return -1;
}
int i;
Plink t=L;
for(i=0;i<L->len;i++)
{
t=t->next;
printf("学号:%d\t姓名:%s\t分数:%d\n",t->data.id,t->data.name,t->data.score);
}
printf("\n");
return 0;
}
int anypos_insert(Plink L,int pos,stu e)
{
if (pos<1||pos>L->len+1||L==NULL)
{
printf("插入失败\n");
return -1;
}
int i;
Plink t=L;
for(i=0;i<pos-1;i++)
{
t=t->next;
}
Plink p=malloc(sizeof(Link));
p->data=e;
p->next=t->next;
t->next=p;
L->len++;
return 0;
}
int anypos_dele(Plink L,int pos)
{
if(pos<1||pos>L->len||L->len==0||L==NULL)
{
printf("删除失败\n");
return -1;
}
Plink t=L;
int i;
for(i=0;i<pos-1;i++)
{
t=t->next;
}
Plink Q=t->next;
t->next=t->next->next;
free(Q);
Q=NULL;
L->len--;
return 0;
}
int nizhi(Plink L)
{
Plink Q=L->next;
Plink t=Q->next;
while(t!=NULL)
{
Q->next=t->next;
t->next=L->next;
L->next=t;
t=Q->next;
}
return 0;
}
int bubble(Plink L)
{
int i;
Plink j;
stu temp;
for(i=1;i<L->len;i++)
{
for(j=L->next;j->next!=NULL;j=j->next)
{
if(j->data.score>j->next->data.score)
{
temp=j->data;
j->data=j->next->data;
j->next->data=temp;
}
}
}
}
int main(int argc, const char *argv[])
{
stu a[5]={{1001,"良太郎",80},{1002,"翔太郎",79},{1003,"飞利浦",90},{1004,"王小明",100}};
Plink L=create();
//stu a[5];
//input(a);
int i;
for(i=0;i<5;i++)
{
front_insert(L,a[i]);//头插法
}
output_link(L);
stu e={1008,"老毕登",89};
anypos_insert(L,2,e);
output_link(L);
anypos_dele(L,2);
output_link(L);
nizhi(L);
output_link(L);
bubble(L);
output_link(L);
return 0;
}