线性表总结

# 1.
1.代码功能:在一个有序链表里插入和删除若干个元素
## 代码1:
```
#include <iostream> 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<<p->data;flag=0; } else { cout<<" "<<p->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 <iostream>
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行,语法不懂,不明白为什么要这样写。

 

posted @ 2019-03-24 15:26  缟涞  阅读(142)  评论(1编辑  收藏  举报