以C结构体或C++的“类”代替“第2章中复杂数据类型”,实现“链式线性表”,编写下面6个接口函数:CreateList、ListPrint、GetElem、ListLength、ListInsert、ListDelete
时间: 2023-05-29 12:04:47 浏览: 74
以下是使用C结构体实现链式线性表的代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node, *List;
void CreateList(List *L) {
*L = NULL;
Node *s, *r = NULL;
int x;
printf("Please input the elements of the list (end with -1):\n");
scanf("%d", &x);
while (x != -1) {
s = (Node *) malloc(sizeof(Node));
s->data = x;
s->next = NULL;
if (*L == NULL) {
*L = s;
} else {
r->next = s;
}
r = s;
scanf("%d", &x);
}
}
void ListPrint(List L) {
printf("The elements of the list are:\n");
while (L != NULL) {
printf("%d ", L->data);
L = L->next;
}
printf("\n");
}
int GetElem(List L, int i, int *e) {
Node *p = L;
int j = 1;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL || j > i) {
return 0;
} else {
*e = p->data;
return 1;
}
}
int ListLength(List L) {
int len = 0;
while (L != NULL) {
len++;
L = L->next;
}
return len;
}
int ListInsert(List *L, int i, int e) {
Node *p = *L, *s;
int j = 1;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL || j > i) {
return 0;
} else {
s = (Node *) malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
}
int ListDelete(List *L, int i, int *e) {
Node *p = *L, *q;
int j = 1;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL || j > i) {
return 0;
} else {
q = p->next;
*e = q->data;
p->next = q->next;
free(q);
return 1;
}
}
int main() {
List L;
int e;
CreateList(&L);
ListPrint(L);
printf("The length of the list is %d\n", ListLength(L));
if (GetElem(L, 3, &e)) {
printf("The third element of the list is %d\n", e);
} else {
printf("Error: The third element does not exist.\n");
}
if (ListInsert(&L, 4, 100)) {
printf("Insert 100 at the fourth position successfully.\n");
ListPrint(L);
} else {
printf("Error: Failed to insert.\n");
}
if (ListDelete(&L, 2, &e)) {
printf("Delete the second element %d successfully.\n", e);
ListPrint(L);
} else {
printf("Error: Failed to delete.\n");
}
return 0;
}
```
其中,结构体Node表示链表的节点,包含数据data和下一个节点的指针next。而List实则是一个指向Node的指针,也是链表的头节点。
接口函数CreateList用于创建链表,从键盘输入链表元素,以-1作为结束标志。函数ListPrint用于输出链表中所有元素的值。函数GetElem用于获取链表中第i个元素的值,并将其存储在指针e中。函数ListLength用于获取链表的长度。函数ListInsert用于在链表的第i个位置插入元素e。函数ListDelete用于删除链表中第i个元素,并将其值存储在指针e中。
以上接口函数可以满足链式线性表的基本操作需求。