创建单链表,存储4个学生信息(年龄,分数,姓名)。
1、建立学生结构体数组,存放4个学生信息,循环调用插入函数,建立整表
2、任意位置插入一个新学生。变量e是学生结构体变量。
3、任意位置删除一个学生。
4、单链表逆置后将学生信息输出。
#include <myhead.h>
typedef struct
{
int age;
int score;
char name[20];
}stu;//创建学生信息结构体
typedef struct node
{
union
{
int len;//计数器
stu data;//学生信息
};
struct node *next;
}Link,*Plink;
Plink creat_head()
{
Plink p = malloc(sizeof(Link));//申请节点结构体空间
if(NULL==p)
{
printf("头结点创建失败\n");
return NULL;
}
p->len = 0;
p->next = NULL;
return p;//返回头节点
}
int taile_insert(Plink L,stu e)
{
if(L==NULL)
{
printf("单链表为空\n");
return -1;
}
int i;
Plink t = L;
for(i = 0;i<L->len;i++)//指向最后一个节点
{
t =t->next;
}
Plink p = malloc(sizeof(Link));
p->data = e;
t->next = p;
p->next = NULL;
L->len++;
return 0;
}
int output_node(Plink L)
{
int i;
Plink t = L;
for(i = 0;i<L->len;i++)
{
t = t->next;
printf("%d\t%d\t%s\n",t->data.age,t->data.score,t->data.name);
}
}
int any_pos_insert(Plink L,int pos,stu e)
{
if(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++;
printf("插入新学生 成功\n");
return 0;
}
int any_pos_dele(Plink L,int pos)
{
if(L==NULL||L->len==0)
{
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;
L->len--;
free(Q);
Q=NULL;
printf("删除成功\n");
return 0;
}
int rrev_link(Plink L)
{
if(L==NULL||L->len==0)
{
printf("单链表不存在或者为空\n");
return -1;
}
Plink t = L->next;
Plink Q = t->next;
while(Q!=NULL)
{
t->next = Q->next;
Q->next = L->next;
L->next = Q;
Q = t->next;
}
return 0;
}
int main(int argc, const char *argv[])
{
stu st[4] = {{20,80,"张三"},{30,90,"李四"},{19,95,"王五"},{17,77,"马六"}};
Plink L = creat_head();
int i;
for(i = 0;i<4;i++)
{
taile_insert(L,st[i]);//尾插法创建整表
}
output_node(L);
stu e = {100,100,"威哥"};//定义待插入的学生信息
any_pos_insert(L,3,e);//将威哥插入到第3个位置
output_node(L);
any_pos_dele(L,3);//删除威哥
output_node(L);
rrev_link(L);//逆置单链表
printf("\n逆置后的单链表:\n");
output_node(L);
return 0;
}