单链表的基本操作的完整代码
时间: 2023-12-06 20:04:15 浏览: 38
很抱歉,根据提供的引用内容,我无法提供单链表基本操作的完整代码。但是,我可以为您提供单链表基本操作的概述和示例代码,以供参考。
单链表的基本操作包括:初始化、判断空链表、销毁、清空、求表长、取值、按值查找返回元素所在地址、按值查找返回元素所对应序号、结点插入和删除以及头插法和尾插法建立单链表等。
以下是单链表基本操作的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
} Node, *LinkList;
// 初始化链表
void InitList(LinkList *L) {
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
}
// 判断链表是否为空
int ListEmpty(LinkList L) {
return L->next == NULL;
}
// 销毁链表
void DestroyList(LinkList *L) {
Node *p, *q;
p = *L;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
*L = NULL;
}
// 清空链表
void ClearList(LinkList L) {
Node *p, *q;
p = L->next;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
L->next = NULL;
}
// 求链表长度
int ListLength(LinkList L) {
int len = 0;
Node *p = L->next;
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
// 获取链表中第i个元素的值
int GetElem(LinkList L, int i, ElemType *e) {
int j = 1;
Node *p = L->next;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL || j > i) {
return 0;
}
*e = p->data;
return 1;
}
// 查找链表中第一个值为e的元素,并返回其位置
int LocateElem(LinkList L, ElemType e) {
int i = 1;
Node *p = L->next;
while (p != NULL && p->data != e) {
p = p->next;
i++;
}
if (p == NULL) {
return 0;
}
return i;
}
// 在链表的第i个位置插入元素e
int ListInsert(LinkList *L, int i, ElemType e) {
int j = 1;
Node *p = *L, *s;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL || j > i) {
return 0;
}
s = (Node*)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
// 删除链表中第i个元素,并将其值赋给e
int ListDelete(LinkList *L, int i, ElemType *e) {
int j = 1;
Node *p = *L, *q;
while (p != NULL && j < i) {
p = p->next;
j++;
}
if (p == NULL || j > i) {
return 0;
}
q = p->next;
*e = q->data;
p->next = q->next;
free(q);
return 1;
}
// 头插法建立链表
void CreateListHead(LinkList *L, int n) {
Node *p;
int i;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
for (i = 0; i < n; i++) {
p = (Node*)malloc(sizeof(Node));
p->data = i + 1;
p->next = (*L)->next;
(*L)->next = p;
}
}
// 尾插法建立链表
void CreateListTail(LinkList *L, int n) {
Node *p, *r;
int i;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
r = *L;
for (i = 0; i < n; i++) {
p = (Node*)malloc(sizeof(Node));
p->data = i + 1;
r->next = p;
r = p;
}
r->next = NULL;
}
int main() {
LinkList L;
int i, len, e;
InitList(&L);
for (i = 1; i <= 5; i++) {
ListInsert(&L, i, i);
}
len = ListLength(L);
printf("链表长度为:%d\n", len);
GetElem(L, 3, &e);
printf("链表第3个元素的值为:%d\n", e);
i = LocateElem(L, 4);
printf("链表中值为4的元素的位置为:%d\n", i);
ListDelete(&L, 2, &e);
printf("删除链表中第2个元素,其值为:%d\n", e);
len = ListLength(L);
printf("链表长度为:%d\n", len);
DestroyList(&L);
return 0;
}
```