1.首先建立学生的结构体,还有数据域,Node *next头指针等;
#include<stdio.h>
#include<malloc.h>
#include <iostream>
#include <string>
#include<typeinfo>
#define Maxsize 50
typedef struct Student //建立学生结构体
{
char id[50];
char name[50];
int age;
}Stu;
typedef struct Node
{
Stu data;
struct Node *next;
}LinkList;
2.创建一个空链表
void initList(LinkList *&L)
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
3.我们利用循环建立数据节点
void CreateListF(LinkList *&L,Stu a[],int n)
{
LinkList *s;
int i;
for (i=0;i<n;i++) //for循环建立数据节点
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}
4.我们如果想在后续实现插入操作,可以建立一个函数,来实现插入操作
无论是插入还是从删除都需要先判断链中寻找的那个数据是否为NULL
bool CreateListH(LinkList *&L,Stu b,int n)
{
int j=0;
LinkList *p=L,*s;
while(j<n-1&&p!=NULL)
{
j++;//定位,找到想要插入到第几个位置的那个节点的上一个节点,即第i-1个节点
p=p->next;
}
if(p==NULL){
return false;
}
else
{
s=(LinkList *)malloc(sizeof(LinkList));//建立一个新指针
s->data=b;//插入的哪个元素的信息存入指针s的数据域
s->next=p->next;//先将p->next链接给s,防止断链
p->next=s;//再将s链到p->next上,实现插入
return true;
}
}
在选择时应该先找到所要插入的位置的前一个元素,将指针指向它。
注意!在插入时,不能直接p->next=s,如果这样会导致断链,应该先将s和p->next连接,即s->next=p->next,这样就可以将s先连接到p->next,不会断链,再将p->next=s,实现插入操作。
5.建立一个函数实现删除操作
bool ListDelete(LinkList *&L,int i,Stu &c)
{
int j=0;
LinkList *p=L,*s;
while(j<i-1&&p!=NULL)
{
j++; //定位,找到想要删除的那个节点的上一个节点,即第i-1个节点
p=p->next;
}
if(p==NULL)
return false;
else
{
s=p->next; //将需要删除的第i个节点连接到空指针s上
if(s==NULL){
return false;
}
c=s->data;
p->next=s->next;//让第i-1个节点连接到第i+1个节点,相当于删除第i个节点
free(s);
return true; //返回true表示成功删除
}
}
在这里要注意的是,要先将要删除的数据储存起来,先将s=p->next,再将p->next=s->next,实现将需要删除的元素隔去,两边数据元素相连,保证链表不断,最后free(s)。
6.单链表逆置函数
ListReverse(LinkList* L)
{ // 将带表头节点的单链表逆置
LinkList *q, *p, s;
p = L;
p = p->next;
L->next = NULL;
while(p) // 因为 while 中有 p = p->next 所以终止条件不用写成 p->next
{
q = p;
p = p->next;
q->next = L->next; // q 节点指向现在的 L 的首元结点。这一行加上下一行相当于一个插入操作
L->next = q;
}
return true;
}
逆置就是头尾互换嘛,比如1122233逆置后就是3322211
7.显示学生单链表中学生的信息
void dispList(LinkList* L)
{
LinkList *p=L->next;
int i=1;
printf("\n-------学生表-------\n");
while(p!=NULL)
{
printf("--第%d位:%s %s %d\n",i,p->data.id,p->data.name,p->data.age);
p=p->next;
i++;
}
printf("---------------------\n");
}
8.实现(整合)
void menu1()
{
printf("---------------------\n");
printf("---------------------\n");
printf("---------------------\n");
printf("---------------------\n");
printf("---------------------\n");
printf("---------------------\n");
printf("---------------------\n");
printf("---------------------\n");
printf("-----学生表的应用----\n");
printf("----1.增加学生信息---\n");
printf("----2.删除学生信息---\n");
printf("----3.显示学生信息---\n");
printf("----4.学生信息逆置---\n");
printf("----5.!!退出!!!---\n");
}
main()
{
LinkList *h;
int flag=1,j,i;
Stu stu[4]={"004","周",16,"003","吴",17,"002","郑",18,"001","王",19},e;
menu1();
printf("--1.初始化学生表的单链表\n");
initList(h);
printf("--2.前插法插入学生信息\n");
CreateListF(h,stu,4);
printf("--3.显示单链表(学生表)信息\n");
dispList(h);
while(flag==1)
{
printf("请选择你想实现的操作:\n");
scanf("%d",&j);
switch(j)
{
case 1:
Stu e;
printf("请依次输入学生的id,姓名,年纪:");
scanf("%s%s%d",&e.id,&e.name,&e.age);
printf("请输入插入的位置:");
scanf("%d",&i);
fflush(stdin);
CreateListH(h,e,i);//调用函数bool CreateListH(LinkList *&L,Stu b,int n),实现插入
printf("成功!!!\n");
break;
case 2:
printf("请输入删除的位置:");
scanf("%d",&i);
ListDelete(h,i,e);//调用函数bool ListDelete(LinkList *&L,int i,Stu &c),实现删除
printf("成功!!!\n");
break;
case 3:
dispList(h);//调用函数void dispList(LinkList* L), 显示单链表存储的信息
printf("成功!!!\n");
break;
case 4:
ListReverse(h);//调用函数ListReverse(LinkList* L),实现逆置
printf("成功!!!\n");
break;
case 5:
flag=0;
printf("!!退出!!\n");
break;
}
}
}
这个代码还实现了,只要用户不想退出,没有输入错误,就可以一直实现操作!
谢谢您的浏览,希望可以帮到您,小伙伴们,加油!!!