完成单链表操作,要求节点构造类型。
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 bublu(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,"张震",90},{1003,"江天乐",95},{1002,"张航",88},{1005,"张方",99},{1004,"王成",89}};
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 = {1009,"黑狗",99};
anypos_insert(L,2,e);
output_link(L);
anypos_dele(L,2);
output_link(L);
nizhi(L);
output_link(L);
bublu(L);
output_link(L);
return 0;
}