本博文源于严蔚敏老师的书籍《数据结构》今天需要验证书籍中的单链表,我闲来无事直接帮他们实现了。
题目再现
1、现单链表的主要基本操作,并写一个主程序验证;
2、在单链表L的两个数据元素a和b间插入x,写出插入x的算法实现,并写程序进行验证
题目解题思想
- 题目1主要将书上的代码敲一遍就行了
- 第二题直接给出O(n)的遍历进行插入
题目1:
Status GetElem_L(LinkList L,int i,ElemType &e){
LinkList p = L->next;
int j = 1;
while(p && j<i){
p = p->next;
++j;
}
if(!p || j>i) return ERROR;
e = p->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e){
LinkList p = L;
int j = 0;
while(p && j<i-1){
p = p->next;
++j;
}
if(!p || j>i-1) return ERROR;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e){
LinkList p = L;
int j = 0;
while(p->next && j<i-1){
p = p->next ;
++j;
}
if(!(p->next)||j>i-1) return ERROR;
LinkList q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
}
void CreateList_L(LinkList&L,int n ){
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(int i=n;i>0;i--){
LinkList p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
}
题目2
Status LinkList_ab(LinkList&L,ElemType a,ElemType b,ElemType x){
LinkList p = L;
p = p->next;
while(p){
if(p->data == a) break;
p = p->next;
}
LinkList q = p->next;
if(p==NULL || q==NULL) return ERROR;
else{
LinkList tmp = (LinkList)malloc(sizeof(LNode));
tmp->data = x;
p->next = tmp;
tmp->next = q;
}
return OK;
}
总结
没啥难度,直接按照书上编写就行了。
完整代码
#include<iostream>
#define ERROR -1
#define OK 1
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode*next;
}LNode,*LinkList;
Status GetElem_L(LinkList L,int i,ElemType &e){
LinkList p = L->next;
int j = 1;
while(p && j<i){
p = p->next;
++j;
}
if(!p || j>i) return ERROR;
e = p->data;
return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e){
LinkList p = L;
int j = 0;
while(p && j<i-1){
p = p->next;
++j;
}
if(!p || j>i-1) return ERROR;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete_L(LinkList &L,int i,ElemType &e){
LinkList p = L;
int j = 0;
while(p->next && j<i-1){
p = p->next ;
++j;
}
if(!(p->next)||j>i-1) return ERROR;
LinkList q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
}
void CreateList_L(LinkList&L,int n ){
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(int i=n;i>0;i--){
LinkList p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
}
//在单链表L的两个数据元素a和b间插入x,写出插入x的算法实现
//假设相邻
Status LinkList_ab(LinkList&L,ElemType a,ElemType b,ElemType x){
LinkList p = L;
p = p->next;
while(p){
if(p->data == a) break;
p = p->next;
}
LinkList q = p->next;
if(p==NULL || q==NULL) return ERROR;
else{
LinkList tmp = (LinkList)malloc(sizeof(LNode));
tmp->data = x;
p->next = tmp;
tmp->next = q;
}
return OK;
}
Status Print(LinkList L){
if(L==NULL) return ERROR;
LinkList p = L;
p=p->next;
while(p){
cout << " " << p->data;
p=p->next;
}
cout << endl;
}
int main(){
LinkList L;
cout << "test1:createList:" << endl;
CreateList_L(L,5);
Print(L);
//Delete L
//1 2 3 4 5
int x;
int flag = ListDelete_L(L,1,x);
cout << "test2: deleted: " << x << endl;
Print(L);
cout << "test3: geted:" ;
GetElem_L(L,2,x);
cout << x << endl;
cout << "test4:ListInsert_L:5" << endl;
ListInsert_L(L,2,5);
Print(L);
cout << "test5:insert [5,3] into 4"<< endl;
LinkList_ab(L,5,3,4);
Print(L);
return 0;
}