线性表总结

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行,语法不懂,不明白为什么要这样写。

你可能感兴趣的:(线性表总结)