1.
1.代码功能:在一个有序链表里插入和删除若干个元素
代码1:
#include
using namespace std;
typedef int ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next; //指向后继结点
} LNode,*LinkList;
void CreateListR(LinkList &L,int n);//尾插法建链表
void DispList(LinkList L);//输出链表
void DestroyList(LinkList &L);//销毁链表
void ListInsert(LinkList &L,ElemType e);//有序链表插入元素e
void ListDelete(LinkList &L,ElemType e);//链表删除元素e
int main()
{
LinkList L,L1,L2;
int n,e;
cin>>n;
CreateListR(L,n);//细节不表。
cin >> n;
while (n--)
{
cin >> e;
ListInsert(L, e);
}
cout << "插入数据后的链表:";
DispList(L);
cout << endl;
cin >> n;
while (n--)
{
cin >> e;
ListDelete(L, e);
}
cout << "删除数据后的链表:";
DispList(L);
DestroyList(L);//销毁链表,细节不表
return 0;
}
void DispList(LinkList L)
{
LinkList p;
int flag=1;
p=L->next;
if (L->next == NULL)
{
cout << "空链表!";
return;
}
while(p){
if(flag) {
cout<data;flag=0;
}
else {
cout<<" "<data;
}
p=p->next;
}
}
我的代码:
void ListInsert(LinkList &L, ElemType e) { //1
LNode *m = L, *p; //2
while (m->next != NULL && m->next->data < e) { //3
m = m->next; //4
} //5
p = new LNode; //6
p->data = e; //7
p->next = m->next; //8
m->next = p; //9
} //10
void ListDelete(LinkList &L, ElemType e) { //11
LNode *m = L, *n; //12
if (m->next == NULL) { //13
return; //14
} //15
while (m->next != NULL && m->next->data != e) { //16
m = m->next; //17
} //18
if (m->next == NULL) { //19
cout << e << "找不到!" << endl; //20
} //21
else { //22
n = m->next; //23
m->next = n->next; //24
delete n; //25
} //26
} //27
代码分析:先根据要插入数的大小,寻找到要插入的位置,将要插入的数用s插入到链表中。要删除元素时,先找到要删除的元素再利用中间指针n将它删除,如果找不到要删除的元素,则说明那个元素不在链表中。
不懂的地方:第2到第9行,语法不懂,为什么要那样写;
第13到15行,语法不懂。
2
1.代码功能:合并两个有序链表,合并后的链表仍递增有序,合并后需要删除重复元素。
代码1:
#include
using namespace std;
typedef int ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next; //指向后继结点
} LNode,*LinkList;
void CreateListR(LinkList &L, int n);//尾插法建链表
void DispList(LinkList L);//输出链表
void DestroyList(LinkList &L);//销毁链表
void MergeList(LinkList &L1,LinkList L2);
int main()
{
LinkList L1,L2;
int n,m;
cin>>n;
CreateListR(L1,n);//尾插法建链表L1,细节不表
cin>>m;
CreateListR(L2,m);//尾插法建链表L2
MergeList(L1,L2);//合并链表
DispList(L1);//输出链表L1,细节不表
DestroyList(L1);//销毁链表,细节不表
DestroyList(L2);//销毁链表
return 0;
}
(```)
## 我的代码:
void MergeList(LinkList &L1,LinkList L2){ //1
LNode pa,pb,r,p; //2
pa = L1->next; /3
pb = L2->next; //4
L1->next = NULL; //5
r = L1; //6
while(pa != NULL && pb !=NULL){ //7
if(pa->data<=pb->data){ //8
p = new LNode; //9
p->data = pa->data; //10
if(pa->data == pb->data){ //11
pb = pb->next; //12
} //13
r->next = p; //14
r = p; //15
pa = pa->next; //16
} //17
else{ //18
p = new LNode; //19
p->data = pb->data; //20
if(pb->data == pa->data){ //21
pa = pa->next; //22
} //23
r->next = p; //24
r = p; //25
pb = pb->next; //26
} //27
} //28
while(pa != NULL){ //29
p = new LNode; //30
p->data = pa->data; //31
r->next = p; //32
r=p; //33
pa = pa->next; //34
} //35
while(pb != NULL){ //36
p = new LNode; //37
p->data = pb->data; //38
r->next = p; //39
r=p; //40
pb = pb->next; //41
} //42
r->next = NULL; //43
} //44
```
代码分析:先比较L1和L2的元素,使p1指向L1,p2指向L2,链表L1设为空,选取较小的元素用尾插法插入到链表L1中,比较的过程中一起判断如果p1和p2中有重复的元素则删除重复的元素,到链表p1为空或者p2为空时,将不为空的的链表里剩余的元素全部插入到链表L1中。
不懂的地方:第7到第28行,语法不懂,不明白为什么要这样写。