??涉及操作:链表的初始化 链表的创建 链表插入元素? 链表的删除? 检测链表是否为空 遍历链表
?相关注释见代码,比较详细,不理解的评论私信告诉我哦
#include <iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
typedef struct //结点数据域元素类型
{
char name[8];
float score;
}ElemType;
typedef struct LNode //链式结点
{
ElemType data;
LNode *next;
}LNode,*LinkList;
void Inpute_E(ElemType &e) //给ElemType对象赋初值
{
cout<<"name"<<endl;
cin>>e.name;
cout<<"score"<<endl;
cin>>e.score;
}
void Output_E(ElemType &e) //输出ElemType对象的值
{
cout<<e.name<<"\t"<<e.score<<endl;
}
void InitList(LinkList &L) //初始化链表
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
bool ListEmpty(LinkList L) //检测链表是否为空
{
return L->next==NULL;
}
bool ListInsert_L(LinkList &L,int i,ElemType e) //在链表L的第i个结点前插入e
{
LNode *p=L;
int j=0;
while(p&&j<i-1) //将指针指向要处理的结点处
{
p=p->next;
j++;
}
if(!p||j>i-1) //判断之前指针的指向范围是否正确
{
cout<<"i不在合理范围内,程序结束"<<endl;
return false;
}
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
void CreateList_L(LinkList &L,int n) //创建长度为n的链表并给链表赋值
{
ElemType e;
for(int i=1;i<=n;i++)
{
cout<<"输入节点"<<i<<"的名字和分数"<<endl;
Inpute_E(e);
ListInsert_L(L,i,e);
}
}
void ListTraverse_L(LinkList L,void visit(ElemType&)) //遍历链表
{
cout<<"**********Traverse L begins******"<<endl;
LNode *p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
cout<<"**********Traverse L ends******"<<endl;
}
bool ListDelete_L(LinkList &L,int i,ElemType &e) //删除链表L的第i个结点,并将该节点的值保存至e
{
LNode *p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
{
cout<<"i不在合理范围内,程序结束"<<endl;
return false;
}
LNode *pp;
e=p->next->data;
pp=p->next;
p->next=p->next->next;
free(pp);
return true;
}
int main()
{
LinkList L;
InitList(L);//建立空表L
CreateList_L(L,3);//构建一个有三个结点单链表
ListTraverse_L(L,Output_E);//输出单链表
cout<<"你实现的功能效果如下:"<<endl;
ElemType e;
strcpy(e.name,"溜溜");//字符数组在定义的时候可以直接赋值,但是不能定义完后用name=“a”这种方式赋值(可以用cin),因为定义时已经指向了空间,不能再指向“a”这个常量
e.score=66;
//Inpute_E(e);
ListInsert_L(L,2,e);
ListTraverse_L(L,Output_E);
ListDelete_L(L,3,e);
Output_E(e);
return 0;
}
|