Zihao

Make small but daily progress

0%

数据结构(c语言版)-线性表

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
#include<stdlib.h>  
#include<stdio.h>
// 初始化参数
#define MAX 20
#define LISTINCREMENT 10

#define OVERFLOW -2

#define TRUE 1
#define FALSE 0

typedef struct {
int *elem; // 存储空间的基地址
int length; // 当前线性表的长度
int listsize; // 当前分配的存储容量
} SqList;

// 初始化线性表
int initSqList(SqList *L){
// 开辟空间,将地址赋予指针
L->elem = (int *) malloc(MAX * sizeof(int));
if(!L->elem) exit(OVERFLOW) ;
L->listsize = MAX;
printf("输入表的长度:");
scanf("%d",&L->length);
printf("输入%d个数:",L->length);
for(int i=0;i<L->length;i++){
scanf("%d",&L->elem[i]);
}
return TRUE;
}
// 列表
int traverse(SqList *L){
//遍历
printf("表中数据为:");
for(int i=0; i < L->length;i++){
printf("%3d",L->elem[i]);
}
printf("\n");
return TRUE;
}
// 插入
int insert(SqList *L){
//插入元素及其要插入的位置
int i;
int e;
printf("输入要插入的位置及元素\n");
scanf("%d%d",&i,&e);
printf("在顺序线性表中第%d个位置之前插入新的元素%d。\n",i,e);
if(i > L->length+1 || i<1) return FALSE;
int *p,*q;
q = &(L->elem[i-1]);
p = &(L->elem[L->length-1]);
for(p ; p >= q; --p) {
*(p+1) = *p;
}
*q = e;
++L->length;
return TRUE;

}
// 删除
int delete(SqList *L){
// 删除元素位置或根据元素查询位置
int i,e;
printf("输入要删除第几个元素");
scanf("%d",&i);
if((i < 1) || (i > L->length)) return FALSE;
int *p,*q;
p = &(L->elem[i-1]);
e = *p;
q = L->elem + L->length-1;
for(++p; p<=q; ++p) {
// 被删除元素之后的元素左移
*(p-1) = *p;
}
--L->length;
printf("元素被删除");
return TRUE;
}
// 查找
int find(SqList *L){
printf("输入查找的元素:");
int e;
scanf("%d",&e);
for(int i = 0; i < L->length; i++)
{
if(L->elem[i] == e){
printf("查找成功,查找元素为%d \n",L->elem[i]);
return TRUE;
}
}
printf("查找失败 \n");
return FALSE;
}


int main(){
SqList L;
initSqList(&L);
traverse(&L);
find(&L);
insert(&L);
traverse(&L);
delete(&L);
traverse(&L);
return 0;
}

注意:

  1. SqList &L 为引用,SqList *L 为指针,在c语言中其实是没有引用这个概念的,只有指针概念,所以本实例使用指针操作,如:int initSqList(SqList *L)
  2. 在C语言中,箭头(->)是指针操作符,点(.)是结构操作符。如果L是一个结构实例的指针,要用->访问结构里面的变量,而不能用点;如果L是一个结构的实例,而非指针,则只能用点而不能用->。
  • 本文作者: Zihao Yao
  • 本文链接: https://yaozihao.com/data_structure/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道