顺序表

增加元素

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
#include <stdio.h>  
#include <string.h>

#define MAXSIZE 100
typedef int ElemType;

//顺序表定义
typedef struct{
ElemType data[MAXSIZE];
int length;
}SeqList;

//顺序表初始化
void initList(SeqList *L){
L->length = 0;;
}

//尾部添加元素
int appendElem(SeqList *L, ElemType e){
if(L->length >= MAXSIZE){
printf("顺序表已满\n");
return 0;
}

L->data[L->length] = e;
L->length++;
return 1;
}

//遍历
void listElem(SeqList *L){
for(int i = 0; i < L->length; i++){
printf("%d ", L->data[i]);
}
printf("\n");
}

//中间插入数据
int insertElem(SeqList *L, int pos, ElemType e){
if(L->length >= MAXSIZE){
printf("顺序表已满\n");
return 0;
}

if(pos < 1 || pos > L->length + 1){
printf("插入位置不合法\n");
return 0;
}

if(pos <= L->length){
for(int i = L->length-1; i >= pos-1; i--){
L->data[i+1] = L->data[i];
}
L->data[pos-1] = e;
L->length++;
}
return 1;
}


int main()
{
//声明一个线性表并初始化
SeqList list;
initList(&list);
printf("初始化成功,目前长度占用%d\n",list.length);
printf("目前占用内存%zu字节\n", sizeof(list.data));
appendElem(&list, 88);
appendElem(&list, 99);
appendElem(&list, 100);
appendElem(&list, 101);
appendElem(&list, 102);
listElem(&list);
insertElem(&list, 2, 18);
listElem(&list);
return 0;
}

删除元素

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
#include <stdio.h>  
#include <string.h>

#define MAXSIZE 100
typedef int ElemType;

//顺序表定义
typedef struct{
ElemType data[MAXSIZE];
int length;
}SeqList;

//顺序表初始化
void initList(SeqList *L){
L->length = 0;;
}

//尾部添加元素
int appendElem(SeqList *L, ElemType e){
if(L->length >= MAXSIZE){
printf("顺序表已满\n");
return 0;
}

L->data[L->length] = e;
L->length++;
return 1;
}

//遍历
void listElem(SeqList *L){
for(int i = 0; i < L->length; i++){
printf("%d ", L->data[i]);
}
printf("\n");
}

//删除数据
int deleteElem(SeqList *L, int pos, ElemType *e){
if(L->length == 0){
printf("顺序表为空\n");
return 0;
}

if(pos < L->length){
for(int i = pos; i < L->length; i++){
L->data[i-1] = L->data[i];
}
}
L->length--;
return 1;
}


int main()
{
//声明一个线性表并初始化
SeqList list;
initList(&list);
printf("初始化成功,目前长度占用%d\n",list.length);
printf("目前占用内存%zu字节\n", sizeof(list.data));
appendElem(&list, 88);
appendElem(&list, 99);
appendElem(&list, 100);
appendElem(&list, 101);
appendElem(&list, 102);
listElem(&list);
ElemType delData;
deleteElem(&list, 2, &delData);
printf("被删除的数据为%d\n", delData);
listElem(&list);
return 0;
}

查找元素

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
#include <stdio.h>  
#include <string.h>

#define MAXSIZE 100
typedef int ElemType;

//顺序表定义
typedef struct{
ElemType data[MAXSIZE];
int length;
}SeqList;

//顺序表初始化
void initList(SeqList *L){
L->length = 0;;
}

//尾部添加元素
int appendElem(SeqList *L, ElemType e){
if(L->length >= MAXSIZE){
printf("顺序表已满\n");
return 0;
}

L->data[L->length] = e;
L->length++;
return 1;
}

//遍历
void listElem(SeqList *L){
for(int i = 0; i < L->length; i++){
printf("%d ", L->data[i]);
}
printf("\n");
}

//查找数据位置
int findElem(SeqList *L, ElemType e){
if(L->length == 0){
printf("顺序表为空\n");
return 0;
}

for(int i = 0; i < L->length; i++){
if(L->data[i] == e){
return i+1;
}
}
return 0;
}


int main()
{
//声明一个线性表并初始化
SeqList list;
initList(&list);
printf("初始化成功,目前长度占用%d\n",list.length);
printf("目前占用内存%zu字节\n", sizeof(list.data));
appendElem(&list, 88);
appendElem(&list, 99);
appendElem(&list, 100);
appendElem(&list, 101);
appendElem(&list, 102);
listElem(&list);
printf("查找元素位置为%d\n", findElem(&list, 101));
return 0;
}

链表

初始化单链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>  
#include <stdlib.h>

typedef int ElemType;

typedef struct node{
ElemType data;
struct node *next;
}Node;

// 单链表初始化
Node* initList(){
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
head->data = 0;
return head;
}

int main(){
Node *list = initList();
return 1;
}

单链表——遍历

1
2
3
4
5
6
7
8
9
// 添加打印链表函数
void printList(Node *L){
Node *p = L->next; //跳过头节点
while(p!= NULL){
printf(" %d", p->data);
p = p->next;
}
printf("\n");
}

单链表——头插法

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
#include <stdio.h>  
#include <stdlib.h>

typedef int ElemType;

typedef struct node{
ElemType data;
struct node *next;
}Node;

// 单链表初始化
Node* initList(){
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
head->data = 0;
return head;
}

// 添加打印链表函数
void printList(Node *L){
Node *p = L->next; //跳过头节点
while(p!= NULL){
printf(" %d", p->data);
p = p->next;
}
printf("\n");
}

// 在头部插入元素
int insertHead(Node *L, ElemType e){
Node *p = (Node*)malloc(sizeof(Node));
p->data = e;
p->next = L->next;
L->next = p;
}

int main(){
Node *list = initList();
insertHead(list, 1);
insertHead(list, 2);
printList(list);
return 0;
}

单链表——尾插法

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
#include <stdio.h>  
#include <stdlib.h>

typedef int ElemType;

typedef struct node{
ElemType data;
struct node *next;
}Node;

// 单链表初始化
Node* initList(){
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
head->data = 0;
return head;
}

// 添加打印链表函数
void printList(Node *L){
Node *p = L->next; //跳过头节点
while(p!= NULL){
printf(" %d", p->data);
p = p->next;
}
printf("\n");
}

//获取尾部节点位置
Node* get_tail(Node *L){
Node *p = L;
while(p->next != NULL){
p = p->next;
}
return p;
}

// 在尾部添加元素
Node* insertTail(Node *tail, ElemType e){
Node *p = (Node*)malloc(sizeof(Node));
p->data = e;
p->next = NULL;
tail->next = p;

return p;
}

int main(){
Node *list = initList();
Node *tail = get_tail(list);
tail = insertTail(tail,3);
tail = insertTail(tail,4);
printList(list);
return 0;
}

单链表——在指定位置插入元素

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
#include <stdio.h>  
#include <stdlib.h>

typedef int ElemType;

typedef struct node{
ElemType data;
struct node *next;
}Node;

// 单链表初始化
Node* initList(){
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
head->data = 0;
return head;
}

// 添加打印链表函数
void printList(Node *L){
Node *p = L->next; //跳过头节点
while(p!= NULL){
printf(" %d", p->data);
p = p->next;
}
printf("\n");
}

//获取尾部节点位置
Node* get_tail(Node *L){
Node *p = L;
while(p->next != NULL){
p = p->next;
}
return p;
}

// 在尾部添加元素
Node* insertTail(Node *tail, ElemType e){
Node *p = (Node*)malloc(sizeof(Node));
p->data = e;
p->next = NULL;
tail->next = p;

return p;
}

// 在指定位置添加元素
int insertElem(Node *L, int pos, ElemType e){
Node *p = L;
int i = 0;
// 遍历链表找到插入位置的前驱节点
while(i<pos-1 && p->next!= NULL){
p = p->next;
i++;
}

// 要插入的新节点
Node* q = (Node*)malloc(sizeof(Node));
q->data = e;
q->next = p->next;
p->next = q;

return 0;
}

int main(){
Node *list = initList();
Node *tail = get_tail(list);
tail = insertTail(tail,3);
tail = insertTail(tail,4);
tail = insertTail(tail,5);
tail = insertTail(tail,6);
printList(list);
insertElem(list,3,10);
printList(list);
return 0;
}

单链表——删除指定位置的节点

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
#include <stdio.h>  
#include <stdlib.h>

typedef int ElemType;

typedef struct node{
ElemType data;
struct node *next;
}Node;

// 单链表初始化
Node* initList(){
Node *head = (Node*)malloc(sizeof(Node));
head->next = NULL;
head->data = 0;
return head;
}

// 添加打印链表函数
void printList(Node *L){
Node *p = L->next; //跳过头节点
while(p!= NULL){
printf(" %d", p->data);
p = p->next;
}
printf("\n");
}

//获取尾部节点位置
Node* get_tail(Node *L){
Node *p = L;
while(p->next != NULL){
p = p->next;
}
return p;
}

// 在尾部添加元素
Node* insertTail(Node *tail, ElemType e){
Node *p = (Node*)malloc(sizeof(Node));
p->data = e;
p->next = NULL;
tail->next = p;

return p;
}

// 删除指定节点
int deleteElem(Node *L, int pos){
Node *p = L;
int i = 0;
// 遍历链表找到要删除节点的前驱
while(i<pos-1 && p->next!= NULL){
p = p->next;
i++;
}

if(p->next == NULL){
printf("删除位置错误!\n");
return 0;
}

// q指向要删除的节点
Node *q = p->next;
p->next = q->next;
free(q);
return 0;
}

int main(){
Node *list = initList();
Node *tail = get_tail(list);
tail = insertTail(tail,3);
tail = insertTail(tail,4);
tail = insertTail(tail,5);
tail = insertTail(tail,6);
printList(list);
deleteElem(list,3);
printList(list);
return 0;
}