/*链表 带头结点*/
/*链表由多个结点构成*/
#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;//结点(数据域+指针域) 注:LinkList相当于LNode*
void Input_E(ElemType &e)
{
cout<<"name"<<endl;
cin>>e.name;
cout<<"score"<<endl;
cin>>e.score;
}
void Output_E(ElemType e)
{
cout<<e.name<<"\t"<<e.score<<endl;
}
void InitList(LinkList &L)//建立一个空链表L
{
//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;//第几个结点
//找到第i-1个结点
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||i<1) //超出链表范围(太大) 或者 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;
}
//获取链表L的第i个元素,并将这个元素赋给e
bool GetElem_L(LinkList L,int i,ElemType &e)
{
LNode *p = L;
int j = 0;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||i<1) //超出链表范围(太大) 或者 i<1(非法值 注意这种情况!)
{
cout<<"i错误 获取元素失败\n";
return false;
}
e = p->data;
return true;
}
bool ListDelete_L(LinkList &L,int i, ElemType &e)//删除链表L的第i个节点
{
LNode *p = L;
int j = 0;//第几个结点
//找到第i-1个结点
while(p&&j<i-1)
{
p=p->next;
j++;
}
if(!p||i<1) //超出链表范围(太大) 或者 i<1(非法值 注意这种情况!)
{
cout<<"i不在合理范围内,程序结束"<<endl;
return false;
}
//删除结点为q
LNode *q = p->next;
e=q->data;
//删除
p->next = q->next;
free(q);
return true;
}
bool ListTraverse_L(LinkList L, void visit(ElemType))//以visit方法访问链表每个结点
{
cout<<"**********Traverse L begin*******"<<endl;
LNode *p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
cout<<"**********Traverse L end*********"<<endl;
}
void CreateList_L(LinkList &L,int n) //建立一个长度为n的单链表L---尾插法
{
ElemType e;
for(int i=1; i<=n; i++)
{
cout<<"输入结点"<<i<<"的:"<<endl;
Input_E(e);
ListInsert_L(L,i,e);
}
}
int main()
{
LinkList L;
InitList(L);//建立空表L
CreateList_L(L,3);//构建一个有三个结点单链表
ListTraverse_L(L,Output_E);//输出单链表
/*在L的第2个结点前插入一个结点,并输出L*/
ElemType e;
strcpy(e.name,"森森");
e.score=100;
ListInsert_L(L,2,e);
cout<<"第2个结点前插入后:\n";
ListTraverse_L(L,Output_E);
/*获取第3个元素赋给e,并输出e*/
if(GetElem_L(L,3,e))
{
cout<<"第3个元素为:\n";
Output_E(e);
}
/*删除第2个元素给e,然后输出e,再输出L*/
ListDelete_L(L,2,e);
cout<<"删除结点为:\n";
Output_E(e);
cout<<"删除第2个元素后:\n";
ListTraverse_L(L,Output_E);
return 0;
}
【数据结构C】链表 建立\查找\插入\删除等操作
最新推荐文章于 2024-01-29 13:02:40 发布