作业:创建单链表,存储4个学生信息(年龄,分数,姓名)。
1、建立学生结构体数组,存放4个学生信息,循环调用插入函数,建立整表2、任意位置插入一个新学生。变量e是学生结构体变量。
3、任意位置删除一个学生。
4、单链表逆置后将学生信息输出。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node{
union{
int len;
struct{
char name[10];
int age;
int score;
}data;
};
struct node *next;
}s,*sp;
sp getHead();
int insertStudent(sp p);
int randomInsert(sp p);
int randomDelete(sp p);
int reverse(sp p);
void outLink(sp p);
int main(int argc, const char *argv[])
{
sp head=getHead();
for(int i=0;i<4;i++){
insertStudent(head);
}
outLink(head);
randomInsert(head);
outLink(head);
randomDelete(head);
outLink(head);
reverse(head);
outLink(head);
return 0;
}
//获取头结点
sp getHead(){
sp p=malloc(sizeof(s));
if(p==NULL){
printf("申请空间失败");
return NULL;
}
p->len=0;
p->next=NULL;
return p;
}
//顺序添加
int insertStudent(sp p){
sp node=malloc(sizeof(s));
if(node==NULL){
printf("申请空间失败");
return -1;
}
char name[10];
int age,score;
printf("请输入名字\n");
scanf(" %s",name);
printf("请输入分数\n");
scanf(" %d",&score);
printf("请输入年龄\n");
scanf(" %d",&age);
p->len++;
node->next=NULL;
while(p->next!=NULL){
p=p->next;
}
p->next=node;
strcpy(node->data.name,name);
node->data.score=score;
node->data.age=age;
return 0;
}
void outLink(sp p){
p=p->next;
while(p!=NULL){
printf("学生:%s\t年龄%d\t成绩%d\n",p->data.name,p->data.age,p->data.score);
p=p->next;
}
}
//随机插入
int randomInsert(sp p){
int seq;
printf("请输入插入位置");
scanf(" %d",&seq);
if(seq<1||seq>p->len){
printf("插入位置非法");
return -2;
}
sp node=malloc(sizeof(s));
if(node==NULL){
printf("申请空间失败");
return -1;
}
char name[10];
int age,score;
printf("请输入名字\n");
scanf(" %s",name);
printf("请输入分数\n");
scanf(" %d",&score);
printf("请输入年龄\n");
scanf(" %d",&age);
p->len++;
for(int i=1;i<seq;i++){
p=p->next;
}
node->next=p->next;
p->next=node;
strcpy(node->data.name,name);
node->data.score=score;
node->data.age=age;
return 0;
}
//随机删除
int randomDelete(sp p){
int seq;
printf("请输入删除位置");
scanf(" %d",&seq);
if(seq<1||seq>p->len){
printf("删除位置非法");
return -2;
}
for(int i=1;i<seq;i++){
p=p->next;
}
sp node=p->next;
p->next=p->next->next;
free(node);
return 0;
}
//逆置
int reverse(sp p){
sp next=NULL;
sp current=p->next;
sp pre=NULL;
while(current!=NULL){
//这个不难,我一开始想要同时修改一个节点的前后节点。
//步子迈太大,需要更多的变量和更复杂的逻辑。
//注意从一个方向开始处理,而不同从一个节点。
//保存下一个节点,以免丢失
pre=current->next;
//指向上一个节点
current->next=next;
//将上一个节点赋值为本节点
next=current;
//讲本节点移动至下一个节点
current=pre;
}
//注意,最后current会变成NULL,而next才是第一个元素。
p->next=next;
return 0;
}
运行结果: