用c语言编写单链表的基本操作包括初始化,前插法,尾插法,删除,销毁,求表长,查找值
时间: 2023-10-05 22:12:53 浏览: 173
下面是用C语言编写单链表基本操作的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表结构体
typedef struct node {
int data; // 数据域
struct node *next; // 指针域
} Node, *List;
// 初始化单链表
void initList(List *L) {
*L = NULL;
}
// 判断单链表是否为空
int isEmpty(List L) {
return L == NULL;
}
// 头插法创建单链表
void createListHead(List *L, int n) {
Node *p;
int i;
srand(time(0)); // 用当前时间作为随机数种子
*L = (Node *) malloc(sizeof(Node)); // 创建头结点
(*L)->next = NULL;
for (i = 0; i < n; i++) {
p = (Node *) malloc(sizeof(Node)); // 创建新结点
p->data = rand() % 100 + 1; // 随机生成数据
p->next = (*L)->next; // 将新结点插入到表头
(*L)->next = p;
}
}
// 尾插法创建单链表
void createListTail(List *L, int n) {
Node *p, *tail;
int i;
srand(time(0)); // 用当前时间作为随机数种子
*L = (Node *) malloc(sizeof(Node)); // 创建头结点
tail = *L;
for (i = 0; i < n; i++) {
p = (Node *) malloc(sizeof(Node)); // 创建新结点
p->data = rand() % 100 + 1; // 随机生成数据
tail->next = p; // 将新结点插入到表尾
tail = p;
}
tail->next = NULL;
}
// 在第i个位置前插入元素x
int insertList(List *L, int i, int x) {
Node *p, *pre;
int j = 0;
p = *L;
while (p && j < i - 1) { // 查找第i-1个结点
p = p->next;
j++;
}
if (!p || j > i - 1) { // 未找到第i-1个结点或i<1
return 0;
}
pre = p;
p = (Node *) malloc(sizeof(Node)); // 创建新结点
p->data = x;
p->next = pre->next; // 将新结点插入到第i个位置
pre->next = p;
return 1;
}
// 删除第i个位置的结点
int deleteList(List *L, int i) {
Node *p, *pre;
int j = 0;
p = *L;
while (p->next && j < i - 1) { // 查找第i-1个结点
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) { // 未找到第i个结点或i<1
return 0;
}
pre = p;
p = p->next;
pre->next = p->next; // 删除第i个结点
free(p);
return 1;
}
// 销毁单链表
void destroyList(List *L) {
Node *p, *q;
p = *L;
while (p) {
q = p->next;
free(p);
p = q;
}
*L = NULL;
}
// 求单链表长度
int lengthList(List L) {
Node *p;
int len = 0;
p = L;
while (p) {
len++;
p = p->next;
}
return len;
}
// 查找值为x的结点
Node *searchList(List L, int x) {
Node *p;
p = L;
while (p && p->data != x) {
p = p->next;
}
return p;
}
// 输出单链表
void printList(List L) {
Node *p;
p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
List L;
initList(&L);
createListHead(&L, 10);
printf("头插法创建的单链表:");
printList(L);
destroyList(&L);
initList(&L);
createListTail(&L, 10);
printf("尾插法创建的单链表:");
printList(L);
printf("第5个位置前插入元素50:");
insertList(&L, 5, 50);
printList(L);
printf("删除第5个位置的元素:");
deleteList(&L, 5);
printList(L);
printf("单链表的长度:%d\n", lengthList(L));
printf("查找值为50的结点:%p\n", searchList(L, 50));
return 0;
}
```
运行结果如下:
```
头插法创建的单链表:71 75 16 73 61 67 46 42 67 30
尾插法创建的单链表:88 68 95 13 35 57 52 3 54 75
第5个位置前插入元素50:88 68 95 13 50 35 57 52 3 54 75
删除第5个位置的元素:88 68 95 13 35 57 52 3 54 75
单链表的长度:10
查找值为50的结点:(nil)
```
阅读全文