1.通常把线性表的链式存储结构体简称链表
2.链表的结构
3.初始化
4.插入
5.删除
6.实现单项链表的数据逆转为实例
// linklist.h
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int datatype;
typedef struct linklistnode {
datatype data;
struct linklistnode *next;
} linklist_node, *linklist_pnode;
extern void init_linklist(linklist_pnode *H);
extern int length_linklist(linklist_pnode l);
extern bool insert_linklist(linklist_pnode l, int i, datatype data);
extern bool del_linklist(linklist_pnode l, int i);
extern bool isempty_linklist(linklist_pnode l);
extern void show_linklist(linklist_pnode l);
#endif
// linklist.c
#include "linklist.h"
// 初始化单向链表
void init_linklist(linklist_pnode *H)
{
*H = (linklist_pnode)malloc(sizeof(linklist_node));
if (NULL == (*H)) {
perror("malloc");
exit(1);
}
(*H)->next = NULL;
}
// 计算链表的长度
int length_linklist(linklist_pnode l)
{
linklist_pnode p = l->next;
int i = 0;
while (p) {
i++;
p = p->next;
}
return i;
}
// 在l指向的链表中的i位置插入数据data,成功返回true,失败返回false
bool insert_linklist(linklist_pnode l, int i, datatype data)
{
int length = 0;
linklist_pnode new = NULL;
linklist_pnode p = l;
length = length_linklist(l);
// 判断i是否合法
if (i < 0 || i > length + 1) {
printf("插入位置无效!\n");
return false;
}
// 找到要插入新结点的位置(p指向的结点的后面)
for (int j = 0; j < i; ++j)
p = p->next;
// 插入数据
new = (linklist_pnode)malloc(sizeof(linklist_node));
if (NULL == new) {
perror("malloc");
return false;
}
new->data = data;
new->next = p->next;
p->next = new;
return true;
}
// 在l指向的链表中删除i位置数据data,成功返回true,失败返回false
bool del_linklist(linklist_pnode l, int i)
{
int length = 0;
linklist_pnode q = NULL;
linklist_pnode p = l;
// 判断i是否合法
length = length_linklist(l);
if (i < 0 || i > length) {
printf("删除位置无效!\n");
return false;
}
// 判断链表是否空
if (isempty_linklist(l)) {
printf("链表已空!\n");
return false;
}
// 将i位置的数据删除
for (int j = 0; j < i; ++j)
p = p->next;
q = p->next;
p->next = q->next;
free(q);
return true;
}
bool isempty_linklist(linklist_pnode l)
{
if (l->next == NULL)
return true;
else
return false;
}
void show_linklist(linklist_pnode l)
{
linklist_pnode p;
for (p = l->next; p; p = p->next)
printf("%d\t", p->data);
printf("\n");
}
// linklist_main.c
/*
* 单项链表实现数据逆转,首先建立一个包含若干整数的单项链表
* 然后参考实现数据的逆转, 如 1,2,3,4,5逆转后为 5,4,3,2,1
*/
#include "linklist.h"
void create_linklist(linklist_pnode h, int n);
void reverse_linklist(linklist_pnode h);
int main(void)
{
int n;
linklist_pnode h;
init_linklist(&h); //初始化链表
printf("请输入链表长度:");
scanf("%d", &n);
create_linklist(h, n);
reverse_linklist(h);
show_linklist(h);
return 0;
}
// 创建链表
void create_linklist(linklist_pnode h, int n)
{
datatype d;
for (int i = 0; i < n; ++i) {
printf("请输入数据:");
scanf("%d", &d);
insert_linklist(h, i, d);
show_linklist(h);
}
}
// 逆转
void reverse_linklist(linklist_pnode h)
{
linklist_pnode p, q;
p = h->next;
h->next = NULL;
while (p) {
q = p;
p = p->next;
q->next = h->next;
h->next = q;
}
}