单链表操作(书本)

2018-08-11
loubth
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#include<stdio.h> 
#include<stdlib.h>  
#define OVERFLOW 0  
#define ERROR 0
#define OK  1 
#define Length 5
typedef int Status;
typedef int ElemType;
 
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
 
////////////////////////////////建立单链线性表///////////////////////////////////////////////////////////////////////////////////////
void CreateList_L(LinkList &L,int n){
    //逆位序输入n个元素的值,建立带表头结点的单链线性表L
    L=(LinkList)malloc(sizeof(LNode)) ;
    L->next=NULL;    //先建立一个带头结点的单链表
     
    for(int i=n;i>0;--i){
        LinkList p=(LinkList)malloc(sizeof(LNode));    //生成新结点
        printf("输入元素%d:\n",i);
        scanf("%d",&p->data) ;    //输入元素值
        p->next=L->next;    
        L->next=p;    
    } 
     
    printf("\n单链表创建成功!\n");
    LinkList q=L->next;
    for(int i=0;i<n;i++){
        printf("%d  ",q->data);
        q=q->next;
    }
}
 
 
 
 
////////////////////////////////得到指定元素///////////////////////////////////////////////////////////////////////////////////////
Status GetElem_L(LinkList L,int i,ElemType &e){    //得到线性链表L的第i个元素并将其赋给e 
    //L为带头结点的单链表的头指针 
    //当第i哥元素存在时,其值赋给e并且返回OK,否则返回ERROR
    LNode *p=L->next;    //初始化,p指向第一个结点,j为计数器 
    int j=1;    //计数器 
    while(p&&j<i){    //顺指针向后查找,直到p指向第i个元素或p为空 
        p=p->next;
        ++j;
         
    } 
     
    if(!p||j>i){    //第i个元素不存在 
        return ERROR;
    }
     
    e=p->data;    //取第i个元素 
    return OK; 
}
 
 
////////////////////////////////插入元素///////////////////////////////////////////////////////////////////////////////////////
Status ListInsert_L(LinkList &L,int i,ElemType e){
    //在带头结点的单链线性表中第i个位置之前插入元素e
    LinkList p=L;
    int j=0;
    while(p&&j<i-1){    //寻找第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;
     
    printf("\n插入操作成功!\n");
    LinkList q=L->next;
    for(int i=0;i<Length+1;i++){
        printf("%d  ",q->data);
        q=q->next;
    }
     
    return OK;
}
 
////////////////////////////////删除元素///////////////////////////////////////////////////////////////////////////////////////
Status ListDelete_L(LinkList &L,int i,ElemType e){
    //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 
    LinkList p=L; 
    int j=0;
     
    while(p->next&&j<i-1){    //寻找第i个结点,并令p指向其前驱 
        p=p->next;
        ++j;
    }
     
    if(!(p->next||j>i-1)){    //删除位置不合理 
        return ERROR;
    }
     
    LNode *q=p->next;    //删除并释放结点 
    p->next=q->next;
    e=q->data;
    free(q);
     
    printf("\n删除操作成功!\n");
    LinkList r=L->next;
    for(int i=0;i<Length;i++){
        printf("%d  ",r->data);
        r=r->next;
    }
     
    return OK; 
}
 
 
////////////////////////////////合并单链表///////////////////////////////////////////////////////////////////////////////////////
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) {
    //已知单链表La和Lb的元素按值非递减排列 
    //归并La和Lb得到新的单链表Lc,Lc的元素也按值非递减排列 
    LinkList pa=La->next;
    LinkList pb=Lb->next;
    LinkList pc=La;
    Lc=pc;
    while(pa&&pb){
        if(pa->data<pb->data){
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else{
            pc->next=pb;
            pc=pb;
            pb=pb->next;
         
        }
         
    } 
    pc->next=pa?pa:pb;    //插入剩余段 
    free(Lb);    //释放Lb的头结点 
     
    printf("\n合并后的单链表为:\n");
    LinkList r=Lc->next;
    for(int i=0;i<Length*2;i++){
        printf("%d  ",r->data);
        r=r->next;
    }
}
 
 
 
 
 
 
 
////////////////////////////////主函数///////////////////////////////////////////////////////////////////////////////////////
int main(){
     
    /////////////////////创建一个单链表////////////////////////////////
    printf("\n-------------------------创建一个单链表------------------------------\n");
    LinkList L;
    CreateList_L(L,Length);
    /////////////////////得到指定元素////////////////////////////////
    printf("\n-------------------------得到指定元素------------------------------\n");
    ElemType e; 
    GetElem_L(L,3,e);    //得到第五个元素 
    printf("\n得到的元素是:%d",e);
     
    /////////////////////插入指定元素////////////////////////////////
    printf("\n-------------------------插入指定元素------------------------------\n");
    ListInsert_L(L,3,666);    //在第三个元素之前插入666 
     
    /////////////////////删除指定元素////////////////////////////////
    printf("\n-------------------------删除指定元素------------------------------\n");
    ListDelete_L(L,5,e);    //删除第五个元素 
    /////////////////////合并有序单链表La和Lb至Lc////////////////////////////////
    printf("\n-------------------------合并有序单链表La和Lb至Lc------------------------------\n");
    LinkList La,Lb,Lc;
    CreateList_L(Lc,0);
    printf("\n输入单链表La:\n") ;
    CreateList_L(La,Length);
    printf("\n\n\n输入单链表Lb:\n") ;
    CreateList_L(Lb,Length);
    printf("\n\n");
    MergeList_L(La,Lb,Lc); 
     
     
     
    printf("\n");
    system("pause");
    return 0;
}