学习目标:
掌握单链表的基本操作。
学习内容:
- 单链表的定义
- 使用头插法建立单链表(读入数据的顺序与链表中的顺序相反)
- 使用尾插法建立单链表(读入数据的顺序与链表中的顺序相同)
- 按序号查找结点值
- 按值查找结点
- 插入结点(按照位序)
- 删除节点(按照位序)
- 求单链表的表长
学习产出:
- CSDN 技术博客 1篇
- 代码
#include<iostream> #include<stdlib.h> using namespace std; typedef struct LNode{ int data; //数据域 struct LNode *next; //指针域 }LNode, *LinkList; void List_Head(LinkList &L,int n){ //逆向建立单链表 LNode *s; L=(LinkList)malloc(sizeof(LNode)); int x; L->next=nullptr; for(int i=0;i<n;i++){ s=(LNode*)malloc(sizeof(LNode)); scanf("%d",&x); s->data=x; s->next=L->next; L->next=s; } return; } void List_Tail(LinkList &L, int n){ //正向建立单链表 int x; L=(LinkList)malloc(sizeof(LNode)); L->next=nullptr; LNode *s,*r=L; for(int i=0;i<n;i++){ s=(LNode*)malloc(sizeof(LNode)); scanf("%d",&x); s->data=x; r->next=s; r=s; } r->next=nullptr; return; } LNode *GetElem(LinkList L, int i){ //按序号查找结点 int j=1; //表示p指向第几个结点 LNode *p=L->next; //指向第一个结点 if(i == 0) return L; if(i < 1) return nullptr; while(p!=nullptr && j<i){ p=p->next; j++; } return p; } LNode *LocateElem(LinkList L, int e){ //按值查找结点 LNode *p=L->next; //指向第一个结点 while(p!=nullptr && p->data!=e){ p=p->next; } return p; } bool ListInsert(LinkList &L, int i, int e){ //按位序插入 if(i<1) return false; LNode *p; int j=0; //p指向的是第几个结点 p=L; while(p && j<i-1){ p=p->next; j++; } if(p == nullptr) { //i值不合法 return false; } LNode *s=(LNode *)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return true; } bool ListDelete(LinkList &L, int i, int &e){ //按位序删除 if(i<1) return false; LNode *p; int j=0; //当前P指向的是第几个结点 p=GetElem(L,i-1); if(p == nullptr) return false; LNode *q=p->next; //q指向被删除结点 e=q->data; p->next=q->next; free(q); return true; } int ListLength(LinkList L){ LNode *p=L->next; int length=0; while(p != nullptr){ length++; p=p->next; } return length; } void DisplayList(LinkList L){ //显示线性表 LinkList p=L->next; cout<<"线性表为:"; while(p){ cout<<p->data<<" "; p=p->next; } cout<<endl; return; } int main() { LinkList L; int n; cin>>n; List_Tail(L,n); DisplayList(L); int i,j; cout<<"输入要查找的序号值:"; cin>>i; LNode *p=GetElem(L,i); cout<<p->data<<endl; cout<<"输入要查找的结点值:"; cin>>j; LNode *q=LocateElem(L,j); if(q) cout<<q->data<<endl; else cout<<"该值不存在"<<endl; cout<<"输入要插入的位序和值:"; cin>>i>>j; bool b=ListInsert(L,i,j); if(b) DisplayList(L); else cout<<"输入的位序不合法!"<<endl; cout<<"输入要删除的位序:"; int e=-1; cin>>i; bool b1=ListDelete(L,i,e); if(b1){ cout<<e<<endl; DisplayList(L); } else{ cout<<"输入的位序不合法!"<<endl; } int ListL=ListLength(L); cout<<"线性表的长度为:"<<ListL<<endl; return 0; }