🎯目的:
1、掌握线性链表的操作特点,即指针是逻辑关系的映像。
2、掌握动态产生单链表的方法。
3、熟练掌握单链表的插入、删除操作特点,即指针赋值的先后次序。
4、熟练掌握单链表的取元素操作。
🎯内容:
1、定义单链表类型并动态创建单链表;
2、实现线性表链式存储结构下元素的插入操作;
3、实现线性表链式存储结构下元素的删除操作;
4、实现线性表链式存储结构下取元素操作。
🎯环境:
TC或VC++。
🎯步骤:
🎐1.单链表的存储定义
typedef struct LNode { ElemType data; // 数据域 struct LNode *next; // 指针域 } LNode, *LinkList;
🎐2、从键盘上依次输入21、18、30、75、42、56,尾插法创建单链表,并输出单链表中的各元素值。
🎐3.分别在单链表的第3个位置和第9个位置插入67和10,给出插入成功或失败的信息,并输出单链表中的各元素值。
🎐4.删除单链表中的第6个数据元素和第8个数据元素,给出删除成功或失败的信息,并输出单链表中的各元素值。
🎐5.取单链表中的第5个数据元素和第7个数据元素。
🎯完整代码:
#include "iostream" #define OK 1; #define ERROR 0; typedef int Status; using namespace std; typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; Status InitList(LinkList &L){//创建单链表 L=new LNode;//生成头节点 L->next=NULL;//使头结点指向为空 return OK; } void GreateList_L(LinkList &L,int n){//链表的初始化 LNode *p,*r; r=L; cout<<"你要输入几个数:"; cin>>n; cout<<"请输入您要输入的数:"<<endl; for(int i=0;i<n;i++){ p=new LNode; cin>>p->data; p->next=NULL; r->next=p; r=p; } } Status GetElem(LinkList L,int i,int &e){//链表的取值 LNode *p; p=L->next; int j=1; while(p&&j<i){ p=p->next; j++; } if(!p||j>i)return ERROR; e=p->data; printf("第%d个结点的值是%d\n",i,e); return OK; } LNode *LocateElem(LinkList L,int e){//链表的查找 LNode *p; p=L->next; while(p&&p->data!=e) p=p->next; return p; } Status ListINsert(LinkList &L,int i,int e){//链表的插入 LNode *p,*s; p=L;int j=0; while(p&&(j<i-1)){ p=p->next; j++; } if(!p||j>i-1) return ERROR; s=new LNode; s->data=e; s->next=p->next; p->next=s; return OK; } Status ListDelete(LinkList &L,int i){//链表的删除 LNode *p,*q; p=L; int j=0; while((p->next)&&(j<i-1)){ p=p->next; j++; } if(!(p->next)||(j>i-1)) return ERROR; q=new LNode; q=p->next; p->next=q->next; delete q; return OK; } void OutLinkList(LinkList L){//链表的输出 LNode *p; p=L->next; printf("链表中的值为:\n"); while(p){ printf("%-4d",p->data); p=p->next; } printf("\n"); } void GreateList_G(LinkList &L){//链表的求逆 LNode *p,*q; p=L->next; L->next=NULL; while(p){ q=p->next; p->next=L->next; L->next=p; p=q; } } int main(){ printf("1.创建\n2.初始化\n3.取值\n4.查找\n5.插入\n6.删除\n7.求逆\n0.退出\n-----------------------------\n"); LinkList L; int f=1; int i,n,e,choose; while(f){ printf("请输入您的选择:"); cin>>choose; switch(choose){ case 1: InitList(L); printf("恭喜您,链表创建成功!\n"); break; case 2: GreateList_L(L,n); printf("初始化成功\n"); OutLinkList(L); break; case 3: printf("请输入您要取值的位置:"); cin>>i; if(GetElem(L,i,e)) printf("取值成功\n"); else printf("取值失败\n"); break; case 4: printf("请输入您要查找的值:"); cin>>e; if(LocateElem(L,e)) printf("查找成功!\n"); else printf("查找失败!\n"); break; case 5: printf("请输入您要插入的位置和数值:"); cin>>i>>e; if(ListINsert(L,i,e)==1) printf("插入成功\n"); else printf("插入失败\n"); OutLinkList(L); break; case 6: printf("请输您要删除的位置:"); cin>>i; if(ListDelete(L,i)==1) printf("删除成功\n"); else printf("删除失败\n"); OutLinkList(L); break; case 7: GreateList_G(L); OutLinkList(L); break; case 0: f=0; printf("恭喜您,已退出\n"); break; } } return 0; }