赞
踩
第1关 单链表的插入操作
- #include <stdlib.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
-
- /* 定义ElemType为int类型 */
- typedef int ElemType;
- void input(ElemType &s);
- void output(ElemType s);
- int equals(ElemType a,ElemType b);
- /* 单链表类型定义 */
- typedef struct LNnode
- {
- ElemType data;
- struct LNnode *next;
- }LNnode,*LinkList;
-
- void InitList(LinkList &L);
- int ListInsert(LinkList &L,int i,int e) ;
- void ListTraverse(LinkList L,void(*vi)(ElemType));
-
- int main() //main() function
- {
- LinkList A;
- ElemType e;
- InitList(A);
- int n,i;
- // cout<<"Please input the list number ";
- cin>>n;
- for(i=1;i<=n;i++)
- {
- cin>>e;
- ListInsert(A, i, e);
- }
- //cout<<"请输入插入的位置:"<<endl;
- cin>>i;
- //cout<<"请输入插入的值:"<<endl;
- input(e);
- if( ListInsert(A,i,e) )
- {
- cout<<"插入成功,插入后单链表如下:"<<endl;
- ListTraverse(A,output) ;
- }
- else
- cout<<"插入位置不合法,插入失败!"<<endl;
- return 0;
- }
-
-
- /*****ElemType类型元素的基本操作*****/
- void input(ElemType &s)
- {
- cin>>s;
- }
- void output(ElemType s)
- {
- cout<<s<<" ";
- }
- int equals(ElemType a,ElemType b)
- {
- if(a==b)
- return 1;
- else
- return 0;
- }
-
- /*****单链表的基本操作*****/
- void InitList(LinkList &L)
- {
- // 操作结果:构造一个空的单链表L
- /********** Begin **********/
- L = (LinkList )malloc(sizeof(LNnode));
- if(!L) return ;
- L->next = nullptr;
- /********** End **********/
- }
- int ListInsert(LinkList &L,int i,int e)
- {
- // 在带头结点的单链线性表L的第i个元素之前插入元素e
- /********** Begin **********/
- if(!L) return 0;
-
- LinkList p = L;
- for(int j = 1;j<i && p;j++){
- p=p->next;
- }
- if(!p) return 0;
- LinkList a = (LinkList ) malloc(sizeof(LNnode));
- if(!a) return 0;
- a->data = e;
- a->next = p->next;
- p->next = a;
- return 1;
- /********** End **********/
- }
-
- void ListTraverse(LinkList L,void(*vi)(ElemType))
- {
- // 初始条件:单链表L已存在。
- //操作结果:依次对L的每个数据元素调用函数vi()
- /********** Begin **********/
- LinkList p = L;
- while(p->next != nullptr){
- vi(p->next->data);
- p=p->next;
- }
- /********** End **********/
- }
第2关 单链表的删除操作
- #include <stdlib.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
-
- /* 定义ElemType为int类型 */
- typedef int ElemType;
- void input(ElemType &s);
- void output(ElemType s);
- int equals(ElemType a,ElemType b);
-
- /* 单链表类型定义 */
- typedef struct LNnode
- {
- ElemType data;
- struct LNnode *next;
- }LNnode,*LinkList;
-
- void InitList(LinkList &L);
- int ListInsert(LinkList &L,int i,int e) ;
- int ListDelete(LinkList L,int i,ElemType &e);
- void ListTraverse(LinkList L,void(*vi)(ElemType));
-
- int main() //main() function
- {
- LinkList A;
- ElemType e;
- InitList(A);
- int n,i;
- // cout<<"Please input the list number ";
- cin>>n;
- for(i=1;i<=n;i++)
- {
- cin>>e;
- ListInsert(A, i, e);
- }
- //cout<<"请输入删除的位置:"<<endl;
- cin>>i;
- if( ListDelete(A,i,e) )
- {
- cout<<"删除成功,删除后单链表如下:"<<endl;
- ListTraverse(A,output) ;
- cout<<"删除元素的值:";
- output(e);
- cout<<endl;
- }
- else
- cout<<"删除位置不合法,删除失败!"<<endl;
- }
-
-
-
- /*****ElemType类型元素的基本操作*****/
- void input(ElemType &s)
- {
- cin>>s;
- }
- void output(ElemType s)
- {
- cout<<s<<" ";
- }
- int equals(ElemType a,ElemType b)
- {
- if(a==b)
- return 1;
- else
- return 0;
- }
-
- /*****单链表的基本操作*****/
- void InitList(LinkList &L)
- { // 构造一个空的单链表L
- L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
- if(!L) // 存储分配失败
- return ;
- L->next=NULL; // 指针域为空
-
- }
-
- int ListInsert(LinkList &L,int i,ElemType e)
- { // 在带头结点的单链线性表L的第i个元素之前插入元素e
- LinkList p,s;
- p = L;
- int j = 0;
- while (p && j < i-1) { // 寻找第i-1个结点
- p = p->next;
- ++j;
- }
- if (!p || j > i-1)
- return 0; // i小于1或者大于表长
- s = (LinkList)malloc(sizeof(LNnode)); // 生成新结点
- s->data = e; s->next = p->next; // 插入L中
- p->next = s;
- return 1;
- }
-
- void ListTraverse(LinkList L,void(*vi)(ElemType))
- { // 调用函数vi()依次输出单链表L的每个数据元素
- LinkList p=L->next;
- while(p)
- {
- vi(p->data);
- p=p->next;
- }
- printf("\n");
- }
-
- int ListDelete(LinkList L,int i,ElemType &e) // 算法2.10。不改变L
- {
- // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
- /********** Begin **********/
- if(!L->next) return 0;
-
- LinkList up = L ;
- LinkList p = up->next;
- if(i==1){
- e = L->next->data;
- LinkList t = L->next;
- L->next = L->next->next;
- free(t);
- return e;
- }
- for(int j = 1;j<i && p;j++){
- p = p->next;
- up = up->next;
- }
- if(!p) return 0 ;
- LinkList t = p;
- up->next = p->next;
- e = t->data;
- free(t);
- return e;
- /********** End **********/
- }
第3关 单链表的按照序号查找值操作
- #include <stdlib.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
-
- /* 定义ElemType为int类型 */
- typedef int ElemType;
- void input(ElemType &s);
- void output(ElemType s);
- int equals(ElemType a,ElemType b);
-
- /* 单链表类型定义 */
- typedef struct LNnode
- {
- ElemType data;
- struct LNnode *next;
- }LNnode,*LinkList;
-
- void InitList(LinkList &L);
- int ListInsert(LinkList &L,int i,int e) ;
- void ListTraverse(LinkList L,void(*vi)(ElemType));
- int GetElem(LinkList L,int i,ElemType &e) ;
-
- int main() //main() function
- {
- LinkList A;
- ElemType e;
- InitList(A);
- int n,i;
- // cout<<"Please input the list number ";
- cin>>n;
- for(i=1;i<=n;i++)
- {
- cin>>e;
- ListInsert(A, i, e);
- }
- //cout<<"请输入查找的序号:"<<endl;
- cin>>i;
- if( GetElem(A,i,e) )
- {
- cout<<"查找成功!"<<endl;
- cout<<"第"<<i<<"个元素的值:"<<endl;
- output(e);
- cout<<endl;
- }
- else
- cout<<"查找失败!"<<endl;
- }
-
- /*****ElemType类型元素的基本操作*****/
- void input(ElemType &s)
- {
- cin>>s;
- }
- void output(ElemType s)
- {
- cout<<s<<" ";
- }
- int equals(ElemType a,ElemType b)
- {
- if(a==b)
- return 1;
- else
- return 0;
- }
-
- /*****单链表的基本操作*****/
- void InitList(LinkList &L)
- { // 操作结果:构造一个空的单链表L
- L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
- if(!L) // 存储分配失败
- return ;
- L->next=NULL; // 指针域为空
-
- }
-
- int ListInsert(LinkList &L,int i,ElemType e)
- { // 在带头结点的单链线性表L的第i个元素之前插入元素e
- LinkList p,s;
- p = L;
- int j = 0;
- while (p && j < i-1) { // 寻找第i-1个结点
- p = p->next;
- ++j;
- }
- if (!p || j > i-1)
- return 0; // i小于1或者大于表长
- s = (LinkList)malloc(sizeof(LNnode)); // 生成新结点
- s->data = e; s->next = p->next; // 插入L中
- p->next = s;
- return 1;
- }
-
- void ListTraverse(LinkList L,void(*vi)(ElemType))
- { // 初始条件:单链表L已存在。
- //操作结果:依次对L的每个数据元素调用函数vi()
- LinkList p=L->next;
- while(p)
- {
- vi(p->data);
- p=p->next;
- }
- printf("\n");
- }
-
- int GetElem(LinkList L,int i,ElemType &e)
- {
- // L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回1,否则返回0
- /********** Begin **********/
- if(!L->next) return 0;
- LinkList p = L;
- for(int j =0;j<i && p;j++){
- p = p->next;
- }
- if(!p) return 0;
- e = p->data;
- return e;
-
- /********** End **********/
- }
第4关 单链表的按照值查找结点位序的操作
- #include <stdlib.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
-
-
- /* 定义ElemType为int类型 */
- typedef int ElemType;
- void input(ElemType &s);
- void output(ElemType s);
- int equals(ElemType a,ElemType b);
-
- /* 单链表类型定义 */
- typedef struct LNnode
- {
- ElemType data;
- struct LNnode *next;
- }LNnode,*LinkList;
- void InitList(LinkList &L);
- int ListInsert(LinkList &L,int i,int e) ;
- void ListTraverse(LinkList L,void(*vi)(ElemType));
- int LocateElem(LinkList L,ElemType e,int(*compare)(ElemType,ElemType));
- int main() //main() function
- {
- LinkList A;
- ElemType e;
- InitList(A);
- int n,i;
- // cout<<"Please input the list number ";
- cin>>n;
- for(i=1;i<=n;i++)
- {
- cin>>e;
- ListInsert(A, i, e);
- }
- //cout<<"请输入查找的元素:"<<endl;
- cin>>e;
- i=LocateElem(A,e,equals);
- if( i )
- {
- cout<<"查找成功!"<<endl;
- output(e);
- cout<<"是单链表第"<<i<<"个元素"<<endl;
- }
- else
- cout<<"查找失败!"<<endl;
- }
-
-
-
- /*****ElemType类型元素的基本操作*****/
- void input(ElemType &s)
- {
- cin>>s;
- }
- void output(ElemType s)
- {
- cout<<s<<" ";
- }
- int equals(ElemType a,ElemType b)
- {
- if(a==b)
- return 1;
- else
- return 0;
- }
-
- /*****单链表的基本操作*****/
- void InitList(LinkList &L)
- { // 操作结果:构造一个空的单链表L
- L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
- if(!L) // 存储分配失败
- return ;
- L->next=NULL; // 指针域为空
- }
-
- int ListInsert(LinkList &L,int i,ElemType e)
- { // 在带头结点的单链线性表L的第i个元素之前插入元素e
- LinkList p,s;
- p = L;
- int j = 0;
- while (p && j < i-1) { // 寻找第i-1个结点
- p = p->next;
- ++j;
- }
- if (!p || j > i-1)
- return 0; // i小于1或者大于表长
- s = (LinkList)malloc(sizeof(LNnode)); // 生成新结点
- s->data = e;
- s->next = p->next; // 插入L中
- p->next = s;
- return 1;
- }
-
- void ListTraverse(LinkList L,void(*vi)(ElemType))
- { // 初始条件:单链表L已存在。
- //操作结果:依次对L的每个数据元素调用函数vi()
- LinkList p=L->next;
- while(p)
- {
- vi(p->data);
- p=p->next;
- }
- printf("\n");
- }
-
- int LocateElem(LinkList L,ElemType e,int (*equal)(ElemType,ElemType))
- {
- // 初始条件: 单链表L已存在,equal()是数据元素判定函数(满足为1,否则为0)
- // 操作结果: 返回L中第1个与e满足关系equal()的数据元素的位序,若这样的数据元素不存在,则返回值为0
- /********** Begin **********/
- if(!L->next) return 0;
- LinkList p = L->next;
- for(int i = 1;p;i++){
- if(equal(p->data,e))
- return i;
- p = p->next;
- }
- /********** End **********/
- }
第5关 单链表的逆置操作
- #include <stdlib.h>
- #include <stdio.h>
- #include <iostream>
- using namespace std;
-
- /* 定义ElemType为int类型 */
- typedef int ElemType;
- void input(ElemType &s);
- void output(ElemType s);
- int equals(ElemType a,ElemType b);
-
- /* 单链表类型定义 */
- typedef struct LNnode
- {
- ElemType data;
- struct LNnode *next;
- }LNnode,*LinkList;
- void InitList(LinkList &L);
- int ListInsert(LinkList &L,int i,int e) ;
- void ListTraverse(LinkList L,void(*vi)(ElemType));
- void reverse (LinkList L);
- int main() //main() function
- {
- LinkList A;
- ElemType e;
- InitList(A);
- int n,i;
- // cout<<"Please input the list number ";
- cin>>n;
- for(i=1;i<=n;i++)
- {
- cin>>e;
- ListInsert(A, i, e);
- }
- cout<<"逆置单链表:"<<endl;
- reverse(A);
- ListTraverse(A,output) ;
- }
-
- /*****ElemType类型元素的基本操作*****/
- void input(ElemType &s)
- {
- cin>>s;
- }
- void output(ElemType s)
- {
- cout<<s<<" ";
- }
- int equals(ElemType a,ElemType b)
- {
- if(a==b)
- return 1;
- else
- return 0;
- }
-
- /*****单链表的基本操作*****/
- void InitList(LinkList &L)
- { // 操作结果:构造一个空的单链表L
- L=(LinkList)malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
- if(!L) // 存储分配失败
- return ;
- L->next=NULL; // 指针域为空
- }
-
- int ListInsert(LinkList &L,int i,ElemType e)
- { // 在带头结点的单链线性表L的第i个元素之前插入元素e
- LinkList p,s;
- p = L;
- int j = 0;
- while (p && j < i-1) { // 寻找第i-1个结点
- p = p->next;
- ++j;
- }
- if (!p || j > i-1)
- return 0; // i小于1或者大于表长
- s = (LinkList)malloc(sizeof(LNnode)); // 生成新结点
- s->data = e; s->next = p->next; // 插入L中
- p->next = s;
- return 1;
- }
-
- void ListTraverse(LinkList L,void(*vi)(ElemType))
- { // 初始条件:单链表L已存在。
- //操作结果:依次对L的每个数据元素调用函数vi()
- LinkList p=L->next;
- while(p)
- {
- vi(p->data);
- p=p->next;
- }
- printf("\n");
- }
-
- void reverse (LinkList L)
- {
- //逆置L指针所指向的单链表
- /********** Begin **********/
- LinkList l = L->next;
- LinkList end = l->next;
- LinkList t;
- while(end){
- t = L->next;
- L->next = l->next;
- l->next = end->next;
- end->next = t;
- end = l->next;
- }
-
-
-
- /********** End **********/
- }
第6关 两个有序单链表的合并操作
- #include <stdlib.h>
- #include <stdio.h>
- #include <iostream>
-
- using namespace std;
-
- /* 定义ElemType为int类型 */
- typedef int ElemType;
-
- void input(ElemType &s);
-
- void output(ElemType s);
-
- int equals(ElemType a, ElemType b);
-
- /* 单链表类型定义 */
- typedef struct LNnode {
- ElemType data;
- struct LNnode *next;
- } LNnode, *LinkList;
-
- void InitList(LinkList &L);
-
- int ListInsert(LinkList &L, int i, int e);
-
- void ListTraverse(LinkList L, void(*vi)(ElemType));
-
- void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc);
-
- int main() //main() function
- {
- LinkList A, B, C;
- ElemType e;
- InitList(A);
- InitList(B);
- int n, i;
- // cout<<"Please input the list number ";
- cin >> n;
- for (i = 1; i <= n; i++) {
- cin >> e;
- ListInsert(A, i, e);
- }
- cin >> n;
- for (i = 1; i <= n; i++) {
- cin >> e;
- ListInsert(B, i, e);
- }
- cout << "合并两个有序单链表:" << endl;
- MergeList(A, B, C);
-
- ListTraverse(C, output);
- }
-
- /*****ElemType类型元素的基本操作*****/
- void input(ElemType &s) {
- cin >> s;
- }
-
- void output(ElemType s) {
- cout << s << " ";
- }
-
- int equals(ElemType a, ElemType b) {
- if (a == b)
- return 1;
- else
- return 0;
- }
-
- /*****单链表的基本操作*****/
- void InitList(LinkList &L) { // 操作结果:构造一个空的单链表L
- L = (LinkList) malloc(sizeof(LNnode)); // 产生头结点,并使L指向此头结点
- if (!L) // 存储分配失败
- return;
- L->next = NULL; // 指针域为空
- }
-
- int ListInsert(LinkList &L, int i, ElemType e) { // 在带头结点的单链线性表L的第i个元素之前插入元素e
- LinkList p, s;
- p = L;
- int j = 0;
- while (p && j < i - 1) { // 寻找第i-1个结点
- p = p->next;
- ++j;
- }
- if (!p || j > i - 1)
- return 0; // i小于1或者大于表长
- s = (LinkList) malloc(sizeof(LNnode)); // 生成新结点
- s->data = e;
- s->next = p->next; // 插入L中
- p->next = s;
- return 1;
- }
-
- void ListTraverse(LinkList L, void(*vi)(ElemType)) { // 初始条件:单链表L已存在。
- //操作结果:依次对L的每个数据元素调用函数vi()
- LinkList p = L->next;
- while (p) {
- vi(p->data);
- p = p->next;
- }
- printf("\n");
- }
-
- void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc) { // LC 只是指正 没有指向任何地址
- // 已知单链线性表La和Lb的元素按值非递减排列。
- // 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
- /********** Begin **********/
-
- LinkList a = La->next, b = Lb->next, c = La;
- Lc = c;
-
- while (a && b) {
- LinkList t= (LinkList) malloc(sizeof(LNnode));
- if (!t) return;
- t->next = nullptr;
-
- if (a->data < b->data) {
- t->data = a->data;
- c->next = t;
- c = c->next;
- a = a->next;
- }else {
- t->data = b->data;
- c->next = t;
- c = c->next;
- b = b->next;
- }
- }
-
- while (a) {
- LinkList t= (LinkList) malloc(sizeof(LNnode));
- if (!t) return;
- t->next = nullptr;
-
- t->data = a->data;
- c->next = t;
- c = c->next;
- a = a->next;
- }
- while (b) {
- LinkList t= (LinkList) malloc(sizeof(LNnode));
- if (!t) return;
- t->next = nullptr;
- t->data = b->data;
- c->next = t;
- c = c->next;
- b = b->next;
- }
-
- /********** End **********/
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。