ypedef int status;
typedef int ElemType;
//链表节点及链表数据表示定义
typedef struct Node
{
double math;//数学
double English;//英语
double Chinese;//语文
}StudentData;
typedef struct SingleLinkNode{
StudentData data;
struct SingleLinkNode *next;
}SingleLinkNode,*SingleLinkList;
//以下是单向链表操作函数原型
//初始化操作
status InitSingleLinkList(SingleLinkList &l);
//链表销毁操作
void DestroySingleLinkList(SingleLinkList &l);
//链表清除操作
void ClearSingleLinkList(SingleLinkList &l);
//链表长度
int SingleLinkListLength(SingleLinkList l);
//链表是否为空
bool SingleLinkListEmpty(SingleLinkList l);
//取链表中的第i个元素
status GetSingleLinkListElem(SingleLinkList l,int i,StudentData &e);
//在链表的第i个位置插入元素
status InsertSingleLinkList(SingleLinkList &l,int i,StudentData e);
//删除链表的第i个元素
status DeleteSingleLinkList(SingleLinkList &l,int i);
//打印链表
void PrintSingleLinkList(SingleLinkList l);
//转置当前的链表
SingleLinkList reverse(SingleLinkList l);
//必须包含此文件,因为它包含此文件中要用到的数据表示定义
//以下实现的是带头节点的单向链表
#include"SingleLinkList.h"
#include"stdlib.h"
#include"iostream.h"
#include
#include
//初始化操作
status InitSingleLinkList(SingleLinkList &l){
// if(l)free(l);
if(l=(SingleLinkList)malloc(sizeof(SingleLinkNode)))//如果分配成功,设置节点
{l->next=NULL;
return 1;}
else
return 0;//表示失败
}
//链表销毁操作
void DestroySingleLinkList(SingleLinkList &l)
{
SingleLinkList p=l,q;
while(p)
{
q=p->next ;
p=p->next;
free(q);
}
}
//链表清除操作
void ClearSingleLinkList(SingleLinkList &l)
{
SingleLinkList p=l->next ,q;
while(p)
{
q=p->next ;
free(p);
p=q;
}
l->next =NULL;
}
//链表长度
int SingleLinkListLength(SingleLinkList l)
{
SingleLinkList p=l->next ;
int i=0;
if(l==NULL)
return 0;
while(p)
i++,p=p->next;
return i;
}
//链表是否为空
bool SingleLinkListEmpty(SingleLinkList l)
{
return (l->next==NULL);
}
//取链表中的第i个元素
status GetSingleLinkListElem(SingleLinkList l,int i,StudentData &e)
{
int k=0;
SingleLinkList p=l->next;
if(i<1||i>SingleLinkListLength(l))
return 0;
//1,寻找第i个节点
while(p&&knext;
e =p->data ;
return 1;
}
//在链表的第1个位置插入元素
status InsertSingleLinkList(SingleLinkList &l,int i,StudentData e)
{ i=1;
int k=0;
SingleLinkList p,q ;
if(SingleLinkListLength(l)==0)InitSingleLinkList(l);
p=l ;
if(i<1||i>SingleLinkListLength(l)+1)
return 0;
//1,寻找第i-1个节点
while(p->next &&knext;
//2,构造节点
if(!(q=(SingleLinkList)malloc(sizeof(SingleLinkNode))))
return 0;
//3,设置节点并将节点链入
q->data =e;
q->next =p->next ;
p->next =q;
return 1;
}
//删除链表的第i个元素
status DeleteSingleLinkList(SingleLinkList &l,int i)
{
int k=0;
SingleLinkList p=l->next;
if(i<1||i>SingleLinkListLength(l))
return 0;
//1,寻找第i-1个节点
while(p&&knext;
}
SingleLinkList q=p->next;
p->next=p->next->next ;
free(q);
return 1;
}
//打印链表
void PrintSingleLinkList(SingleLinkList l)
{
SingleLinkList p=l->next ;
int i=1;
while(p)
{ cout<<"第"<data.math<<" "<<"英语成绩"<data.English<<" "<<"语文成绩"<<" "<data.Chinese<<" " ;
cout<next,i++ ;
}
}
SingleLinkList reverse(SingleLinkList head)
{
SingleLinkList p,q,pr;
p = head->next;
q = NULL;
head->next = NULL;
while(p){
pr = p->next;
p->next = q;
q = p;
p = pr;
}
head->next = q;
return head;
}
#include"SingleLinkList.h"
#include
#include
#include
#include
//改变输出位置的函数
void gotoxy(int y,int x){
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void main(void)
{
bool jixu=true,jixu2=true,jixu3=true,jixu4=true;
SetConsoleTitle("张扬测试窗口");
SingleLinkList l;
system("color 0A");
//链表的初始化
InitSingleLinkList(l);
a: gotoxy(5,10);
printf("********************各功能的操作代码********************\n");
gotoxy(6,30);
printf("1 插入学生各科数据\n",50);
gotoxy(7,30);
printf("2 删除学生数据\n",50);
gotoxy(8,30);
printf("3 打印学生数据\n",50);
gotoxy(9,30);
printf("4 获取当前学生的总人数\n");
gotoxy(10,30);
printf("5 转置当前链表\n");
// printf("5 清空当前的链表\n");
// gotoxy(10,30);
printf("请输入你所选择的功能编号\n");
int select;
cin>>select;
switch(select)
{
case 1:
jixu=true;
while(jixu)
{
printf("所要插入的学生的数学成绩 : ");
StudentData data;
cin>>data.math;
printf("所要插入的学生的英语成绩 : ");
cin>>data.English;
printf("所要插入的学生的语文成绩 : ");
cin>>data.Chinese;
if( InsertSingleLinkList(l,1,data)==1)
{
printf("录入学生数据成功\n");
printf("打印当前学生的数据\n");
PrintSingleLinkList(l);
}
else
{
printf("插入数据失败\n");
}
int x;
x=MessageBox(GetForegroundWindow(),"您还继续添加操作吗","提示框",1);
if(x==1)
{
jixu=true;
}
else
{
jixu=false;
}
}
system("cls");//清空窗口
goto a;
case 2:
while(jixu2)
{
printf("请输入所要删除的位置\n");
int scope2=SingleLinkListLength(l);
printf("提示信息当前学生的总数为%d,所以正确的范围为1---%d\n",scope2,scope2);
int delete_index;
cin>>delete_index;
if(DeleteSingleLinkList(l,delete_index)==1)
{
printf("删除成功!\n");
}
else
{
printf("删除失败\n");
}
int x;
x=MessageBox(GetForegroundWindow(),"您还继续删除操作吗","提示框",1);
if(x==1)
{
jixu2=true;
}
else
{
jixu2=false;
}
}
system("cls");//清空窗口
goto a;
case 3:
PrintSingleLinkList(l);
Sleep(2000);
system("cls");//清空窗口
goto a;
case 4:
printf("当前链表的长度%d\n",SingleLinkListLength(l));
Sleep(2000);
system("cls");//清空窗口
goto a;
case 5:
printf("当前链表的数据信息为\n");
PrintSingleLinkList(l);
printf("转置后的链表信息为\n");
PrintSingleLinkList(reverse(l));
Sleep(20000);
system("cls");//清空窗口
default :
ClearSingleLinkList(l);
DestroySingleLinkList(l);
printf("退出系统\n");
exit(0);
break;
}
}
练习资源下载地址:https://pan.baidu.com/s/187EudlF70Ch8TZWuLKzQlw