以C结构体或C++的“类”代替“第2章中复杂数据类型”,实现“链式线性表”,编写下面6个接口函数:CreateList、ListPrint、GetElem、ListLength、ListInsert、ListDelete
时间: 2023-05-29 17:04:43 浏览: 113
用C语言实现数据结构中的线性表(链式表示)
1. 定义链表结构体
```c
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkList;
```
2. CreateList函数:创建链表
```c
LinkList CreateList(int n) {
LinkList L = (LinkList) malloc(sizeof(Node));
L->next = NULL;
LinkList p, q = L;
int i;
for (i = 0; i < n; i++) {
p = (LinkList) malloc(sizeof(Node));
scanf("%d", &p->data);
p->next = NULL;
q->next = p;
q = p;
}
return L;
}
```
3. ListPrint函数:遍历输出链表
```c
void ListPrint(LinkList L) {
LinkList p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
```
4. GetElem函数:获取链表中指定位置的元素
```c
int GetElem(LinkList L, int i) {
LinkList p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
printf("Error: Index out of range!\n");
return -1;
}
return p->data;
}
```
5. ListLength函数:获取链表长度
```c
int ListLength(LinkList L) {
int len = 0;
LinkList p = L->next;
while (p) {
len++;
p = p->next;
}
return len;
}
```
6. ListInsert函数:向链表中指定位置插入元素
```c
void ListInsert(LinkList L, int i, int x) {
LinkList p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p || j > i - 1) {
printf("Error: Index out of range!\n");
return;
}
LinkList q = (LinkList) malloc(sizeof(Node));
q->data = x;
q->next = p->next;
p->next = q;
}
```
7. ListDelete函数:从链表中删除指定位置的元素
```c
void ListDelete(LinkList L, int i) {
LinkList p = L;
int j = 0;
while (p->next && j < i - 1) {
p = p->next;
j++;
}
if (!p->next || j > i - 1) {
printf("Error: Index out of range!\n");
return;
}
LinkList q = p->next;
p->next = q->next;
free(q);
}
```
完整代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkList;
LinkList CreateList(int n) {
LinkList L = (LinkList) malloc(sizeof(Node));
L->next = NULL;
LinkList p, q = L;
int i;
for (i = 0; i < n; i++) {
p = (LinkList) malloc(sizeof(Node));
scanf("%d", &p->data);
p->next = NULL;
q->next = p;
q = p;
}
return L;
}
void ListPrint(LinkList L) {
LinkList p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int GetElem(LinkList L, int i) {
LinkList p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) {
printf("Error: Index out of range!\n");
return -1;
}
return p->data;
}
int ListLength(LinkList L) {
int len = 0;
LinkList p = L->next;
while (p) {
len++;
p = p->next;
}
return len;
}
void ListInsert(LinkList L, int i, int x) {
LinkList p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p || j > i - 1) {
printf("Error: Index out of range!\n");
return;
}
LinkList q = (LinkList) malloc(sizeof(Node));
q->data = x;
q->next = p->next;
p->next = q;
}
void ListDelete(LinkList L, int i) {
LinkList p = L;
int j = 0;
while (p->next && j < i - 1) {
p = p->next;
j++;
}
if (!p->next || j > i - 1) {
printf("Error: Index out of range!\n");
return;
}
LinkList q = p->next;
p->next = q->next;
free(q);
}
int main() {
LinkList L = CreateList(5); // 创建一个长度为5的链表
ListPrint(L); // 遍历输出链表
printf("Length of the list: %d\n", ListLength(L)); // 获取链表长度
printf("Element at position 3: %d\n", GetElem(L, 3)); // 获取链表中第3个元素
ListInsert(L, 3, 100); // 在链表中第3个位置插入元素100
ListPrint(L); // 遍历输出链表
ListDelete(L, 4); // 从链表中删除第4个元素
ListPrint(L); // 遍历输出链表
return 0;
}
```
阅读全文