请详细描述在C语言中实现线性表的头插法和尾插法,并提供创建、插入、删除和查找元素的相关函数示例。
时间: 2024-11-18 14:20:14 浏览: 30
在C语言中实现线性表的头插法和尾插法,我们需要定义链表的节点结构,并且编写相应的函数来完成各种操作。首先,我们定义链表节点的结构体如下:
参考资源链接:[C语言实现线性表的操作:创建、插入、删除与遍历](https://wenku.csdn.net/doc/yd47hkgbuv?spm=1055.2569.3001.10343)
```c
typedef struct LNode {
ElemType data; // 数据域
struct LNode *next; // 指针域,指向下一个节点
} LNode, *LinkList;
```
其中`ElemType`是数据类型,根据实际情况可以是`int`、`char`或其他类型。
接下来,我们实现头插法和尾插法创建链表的函数:
**头插法(头节点不存储数据):**
```c
void CreateListF(LinkList *L, ElemType a[], int n) {
LinkList p;
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL; // 初始化头节点
for (int i = 0; i < n; ++i) {
p = (LinkList)malloc(sizeof(LNode));
p->data = a[i];
p->next = (*L)->next;
(*L)->next = p;
}
}
```
**尾插法(头节点不存储数据):**
```c
void CreateListR(LinkList *L, ElemType a[], int n) {
LinkList p, r;
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
r = *L; // 尾指针
for (int i = 0; i < n; ++i) {
p = (LinkList)malloc(sizeof(LNode));
p->data = a[i];
p->next = NULL;
r->next = p;
r = p;
}
}
```
**初始化线性表:**
```c
void InitList(LinkList *L) {
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
}
```
**销毁线性表:**
```c
void DestroyList(LinkList *L) {
LinkList p = *L, q;
while (p) {
q = p->next;
free(p);
p = q;
}
*L = NULL;
}
```
**元素插入函数:**
```c
Status ListInsert(LinkList L, int i, ElemType e) {
if (i < 1 || i > ListLength(L) + 1) return ERROR;
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = e;
if (i == 1) { // 头插法插入
p->next = L->next;
L->next = p;
} else { // 中间或尾插法插入
LinkList q = L;
for (int j = 1; j < i - 1; ++j) {
q = q->next;
}
p->next = q->next;
q->next = p;
}
return OK;
}
```
**元素删除函数:**
```c
Status ListDelete(LinkList L, int i, ElemType *e) {
if (i < 1 || i > ListLength(L)) return ERROR;
LinkList p = L, q;
if (i == 1) { // 头删法删除
q = L->next;
L->next = q->next;
} else { // 中间或尾删法删除
for (int j = 1; j < i - 1; ++j) {
p = p->next;
}
q = p->next;
p->next = q->next;
}
*e = q->data;
free(q);
return OK;
}
```
**元素查找函数:**
```c
int LocateElem(LinkList L, ElemType e) {
int i = 1;
LinkList p = L->next;
while (p && p->data != e) {
p = p->next;
++i;
}
if (p) return i; // 查找成功,返回元素位置
else return 0; // 查找失败
}
```
在上述代码中,我们使用了`ElemType`和`Status`作为数据类型和返回状态的类型定义,这些类型需要根据实际情况进行定义。例如:
```c
typedef int ElemType;
typedef enum { ERROR, OK } Status;
```
这些函数覆盖了线性表的基本操作,包括初始化、头插法创建链表、尾插法创建链表、元素插入、元素删除和元素查找。通过组合使用这些函数,我们可以完成链表的各种操作。为了进一步学习和掌握这些知识,可以参考《C语言实现线性表的操作:创建、插入、删除与遍历》,这本书会提供更加深入的讲解和示例代码,帮助读者更好地理解和实践。
参考资源链接:[C语言实现线性表的操作:创建、插入、删除与遍历](https://wenku.csdn.net/doc/yd47hkgbuv?spm=1055.2569.3001.10343)
阅读全文