数据结构复习·2 线性表:单链表
宏定义
建议重新复习一下C++对结构体的定义以及typedef声明新的类型名
1 2 3 4 5 6 7 8 9 10 11
|
using namespace std; typedef char ElemType; typedef struct LNode{ //定义单链表节点类型 ElemType data; //数据域 struct LNode *next; //指针域 next指向LNode结构体变量 }LNode,*LinkList; //结构体类型LNode 别名为*LinkList
|
头插法创建单链表
头插法(前插法):新元素插入到链表的表头,即头结点之后,因此结点的次序与插入的次序相反
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int InitList_L(LinkList &L,int n)//头插法创建空表 { L=new LNode;//创建头结点 L->next=NULL; for(int i=1;i<=n;i++) { cout<<"请输入一个元素"<<endl; LNode *p=new LNode; cin>>p->data; p->next=L->next;//p结点与头结点的下一个结点建立连接 L->next=p;//p结点与头结点建立连接,p结点成为头结点的下一个结点 } return 1; }
|
后插法创建单链表
后插法(尾插法):新元素插入到链表表尾,结点的次序与插入的次序是一致的
后插法只比头插法多了一个指向表尾结点的指针r
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int InitList_L(LinkList &L,int n)//后插法创建空表 { L=new LNode;//创建头结点 L->next=NULL; LinkList r;//创建表尾指针r r=L;//表为空时表尾指针r暂时指向头结点 for(int i=1;i<=n;i++){ cout<<"请输入一个元素"<<endl; LNode *p=new LNode;//创建新元素的结点p cin>>p->data; p->next=NULL;//插入新元素p为表尾 r->next=p;//p结点与头结点建立连接 r=p;//r指向表尾元素 } return 1; }
|
插入结点(针对后插法创建的链表)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int ListInsert_L(LinkList &L,int i,ElemType e)//插入数据 { LNode *p=L;//p暂时指向头结点 int j=1; while(p&&(j<i)){//若合法,指针p查找到第i-1个结点 p=p->next; ++j; } LNode *s=new LNode; s->data=e;//创建新结点并赋值 s->next=p->next;//向后连接 p->next=s;//向前连接 return 1; }
|
删除结点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int ListDelete_L(LinkList &L,int i)//删除数据 { LNode *p=L; int j=1; while(p&&(j<i)) { p=p->next; ++j; }//与插入结点的查询i-1相同 p指向第i-1个结点 LNode *q=new LNode; q=p->next;//将要删除的结点赋给q p->next=q->next;//i-1结点指向i+1结点 delete q;//释放结点q return 1; }
|
显示链表内数据
1 2 3 4 5 6 7 8 9 10
| void Disp_L(LinkList L)//显示数据 { LNode *p=L; while(p->next!=NULL) { p=p->next; cout<<p->data<<" "; } cout<<endl; }
|
如果需要计算表长 在while循环里放置一个计数器i输出即可
所有代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| using namespace std;
typedef char ElemType; typedef struct LNode { ElemType data; struct LNode *next;//next指向struct Lnode结构体变量 }LNode,*LinkList;//结构体类型LNode 别名为*LinkList int InitList_L(LinkList &L,int n)//后插法创建空表 { L=new LNode;//头结点 L->next=NULL; LinkList r; r=L; for(int i=1;i<=n;i++) { cout<<"请输入一个元素"<<endl; LNode *p=new LNode; cin>>p->data; p->next=NULL; r->next=p; r=p; } return 1; } int ListInsert_L(LinkList &L,int i,ElemType e)//插入数据 { LNode *p=L; int j=1; while(p&&(j<i)) { p=p->next; ++j; } LNode *s=new LNode; s->data=e; s->next=p->next; p->next=s; return 1; } int ListDelete_L(LinkList &L,int i)//删除数据 { LNode *p=L; int j=1; while(p&&(j<i)) { p=p->next; ++j; } LNode *q=new LNode; q=p->next; p->next=q->next; delete q; return 1; } void Disp_L(LinkList L)//显示数据 { LNode *p=L; while(p->next!=NULL) { p=p->next; cout<<p->data<<" "; } cout<<endl; } int main() { LinkList L; cout<<"请输入要插入的元素数量"; int i,j,m,n; ElemType e; cin>>n; if(InitList_L(L,n)) cout<<"单链表创建完毕"<<endl; else cout<<"单链表创建失败"<<endl; do { cout<<"请输入对应功能的数字: 1.插入 2.删除 3.显示表 "<<endl; cin>>m; switch(m) { case 1: { cout<<"请输入要插入的位置"<<endl; cin>>i; cout<<"请输入要输入的元素"<<endl; cin>>e; if(!ListInsert_L(L,i,e)) cout<<"插入数据失败"<<endl; else cout<<"插入数据成功"<<endl; break; } case 2: { cout<<"请输入要删除的位置"<<endl; cin>>i; if(!ListDelete_L(L,i)) cout<<"删除失败"<<endl; else cout<<"删除成功"<<endl; break; } case 3: { cout<<"输出表数据"<<endl; Disp_L(L); break; } } cout<<"是否继续执行操作 1.继续 2.退出"<<endl; cin>>j; }while(j==1); return 0; }
|