用c语言实现一个线性表的运行,并且运用到所有的基础操作,用两种方法
时间: 2024-03-07 14:47:26 浏览: 65
线性表的C语言实现
好的,下面我分别用数组和链表两种方式,实现线性表的基本操作,并且演示它们的运行。
## 用数组实现线性表
### 定义线性表的数据结构
```
#define MAXSIZE 100 // 定义线性表的最大长度
typedef struct {
int data[MAXSIZE]; // 存储线性表中的元素
int length; // 线性表的当前长度
} SqList;
```
### 初始化线性表
```
// 初始化线性表
void InitList(SqList &L) {
for(int i = 0; i < MAXSIZE; i++) {
L.data[i] = 0; // 将线性表中的每个元素赋初值为0
}
L.length = 0; // 线性表的长度为0
}
```
### 插入元素
```
// 在指定位置插入元素
bool ListInsert(SqList &L, int pos, int elem) {
if(pos < 1 || pos > L.length + 1) { // 判断插入位置的合法性
return false;
}
if(L.length == MAXSIZE) { // 判断线性表是否已满
return false;
}
for(int i = L.length; i >= pos; i--) {
L.data[i] = L.data[i-1]; // 将pos及其后面的元素后移一位
}
L.data[pos-1] = elem; // 将新元素插入到pos位置
L.length++; // 线性表长度加1
return true;
}
```
### 删除元素
```
// 删除指定位置的元素
bool ListDelete(SqList &L, int pos) {
if(pos < 1 || pos > L.length) { // 判断删除位置的合法性
return false;
}
for(int i = pos; i < L.length; i++) {
L.data[i-1] = L.data[i]; // 将pos后面的元素前移一位
}
L.length--; // 线性表长度减1
return true;
}
```
### 查找元素
```
// 查找指定元素的位置
int LocateElem(SqList L, int elem) {
for(int i = 0; i < L.length; i++) {
if(L.data[i] == elem) {
return i+1; // 返回元素在线性表中的位置
}
}
return 0; // 表示元素不存在
}
```
### 打印线性表
```
// 打印线性表中的元素
void PrintList(SqList L) {
for(int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
```
### 运行示例
```
int main() {
SqList L;
InitList(L); // 初始化线性表
ListInsert(L, 1, 1); // 插入元素1
ListInsert(L, 2, 2); // 插入元素2
ListInsert(L, 3, 3); // 插入元素3
PrintList(L); // 打印线性表:1 2 3
ListDelete(L, 2); // 删除元素2
PrintList(L); // 打印线性表:1 3
printf("元素3的位置是:%d\n", LocateElem(L, 3)); // 查找元素3的位置
return 0;
}
```
## 用链表实现线性表
### 定义线性表的数据结构
```
typedef struct LNode {
int data; // 存储线性表中的元素
struct LNode *next; // 指向下一个节点的指针
} LNode, *LinkList;
```
### 初始化线性表
```
// 初始化链表
void InitList(LinkList &L) {
L = (LinkList) malloc(sizeof(LNode)); // 为链表分配头节点的存储空间
L->next = NULL; // 头节点的指针域为空
}
```
### 插入元素
```
// 在指定位置插入元素
bool ListInsert(LinkList &L, int pos, int elem) {
if(pos < 1) { // 判断插入位置的合法性
return false;
}
LNode *p = L;
for(int i = 1; i < pos && p != NULL; i++) {
p = p->next; // 找到pos位置的前一个节点
}
if(p == NULL) { // 判断插入位置的合法性
return false;
}
LNode *q = (LNode*) malloc(sizeof(LNode));
q->data = elem;
q->next = p->next;
p->next = q;
return true;
}
```
### 删除元素
```
// 删除指定位置的元素
bool ListDelete(LinkList &L, int pos) {
if(pos < 1) { // 判断删除位置的合法性
return false;
}
LNode *p = L;
for(int i = 1; i < pos && p->next != NULL; i++) {
p = p->next; // 找到pos位置的前一个节点
}
if(p->next == NULL) { // 判断删除位置的合法性
return false;
}
LNode *q = p->next;
p->next = q->next;
free(q);
return true;
}
```
### 查找元素
```
// 查找指定元素的位置
int LocateElem(LinkList L, int elem) {
LNode *p = L->next;
int i = 1;
while(p != NULL && p->data != elem) {
p = p->next;
i++;
}
if(p == NULL) {
return 0; // 表示元素不存在
}
return i; // 返回元素在线性表中的位置
}
```
### 打印线性表
```
// 打印线性表中的元素
void PrintList(LinkList L) {
LNode *p = L->next;
while(p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```
### 运行示例
```
int main() {
LinkList L;
InitList(L); // 初始化线性表
ListInsert(L, 1, 1); // 插入元素1
ListInsert(L, 2, 2); // 插入元素2
ListInsert(L, 3, 3); // 插入元素3
PrintList(L); // 打印线性表:1 2 3
ListDelete(L, 2); // 删除元素2
PrintList(L); // 打印线性表:1 3
printf("元素3的位置是:%d\n", LocateElem(L, 3)); // 查找元素3的位置
return 0;
}
```
阅读全文