结构体
typedef int datatype;
typedef struct node_t
{
datatype data; // 数据域
struct node_t *next; // 指针域,指向自身结构体的指针
} link_node_t, *link_list_t;
创建一个空的有头单向链表
link_node_t *createEmptyLinkList()
{
link_list_t p = (link_list_t)malloc(sizeof(link_node_t));
if (p == NULL) //容错判断
{
perror("createEmptyLinkList malloc err");
return NULL;
}
p->next = NULL;
return p;
}
写入数据
尾插法
void tou(link_list_t p, int n)
{
int i = 0;
while (i < n)
{
while (p->next != NULL)
{
p = p->next;
}
link_list_t q = (link_list_t)malloc(sizeof(link_node_t));
p->next = q;
q->next = NULL;
scanf("%d", &q->data);
i++;
}
}
链表指定位置插入数据
int insertIntoPostLinkList(link_node_t *p, int post, datatype data)
{
int i = 0;
while (i < post)
{
p = p->next;
i++;
}
link_list_t q = (link_list_t)malloc(sizeof(link_node_t));
q->next = p->next;
q->data = data;
p->next = q;
}
计算链表的长度
int lengthLinkList(link_node_t *p)
{
int i = 0;
while (p->next != NULL)
{
p = p->next;
i++;
}
return i;
}
遍历链表
void showLinkList(link_node_t *p)
{
while (p->next != NULL)
{
p = p->next;
printf("%d", p->data);
}
printf("\n");
}
链表指定位置删除数据
int deletePostLinkList(link_node_t *p, int post)
{
if (post < 0 || post >= lengthLinkList(p) || p->next == NULL)
{
return -1;
}
int i = 0;
while (i < post)
{
p = p->next;
if (i == post - 1)
{
link_list_t q = p->next;
p->next = q->next;
free(q);
}
i++;
}
}
判断链表是否为空
int isEmptyLinkList(link_node_t *p)
{
return p->next == NULL;
}
清空单向链表
void clearLinkList(link_node_t *p)
{
link_list_t q = NULL;
while (p->next != NULL)
{
q = p->next;
p->next = q->next;
free(q);
}
}
修改指定位置的数据 post 被修改的位置 data修改成的数
int changePostLinkList(link_node_t *p, int post, datatype data)
{
if (post < 0 || post >= lengthLinkList(p))
{
return -1;
}
int i = 0;
while (i <= post)
{
p = p->next;
if (i = post)
{
p->data = data;
}
i++;
}
}
查找指定数据出现的位置 data被查找的数据
int searchDataLinkList(link_node_t *p, datatype data)
{
int i = 0;
while (p->next != NULL)
{
if (p->data == data)
{
return i;
}
else
{
p = p->next;
}
i++;
}
return -1;
}
删除单向链表中出现的指定数据,data代表将单向链表中出现的所有data数据删除
int deleteDataLinkList(link_node_t *p, datatype data)
{
link_list_t q;
while (p->next != NULL)
{
if (p->next->data == data)
{
q = p->next;
p->next = p->next->next;
free(q);
}
else
{
p = p->next;
}
}
}
总代码
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node_t
{
datatype data; // 数据域
struct node_t *next; // 指针域,指向自身结构体的指针
} link_node_t, *link_list_t;
//写入数据
void tou(link_list_t p,int n);
// 1.创建一个空的有头单向链表
link_node_t *createEmptyLinkList();
// 2.链表指定位置插入数据
int insertIntoPostLinkList(link_node_t *p, int post, datatype data);
// 3.计算链表的长度。
int lengthLinkList(link_node_t *p);
// 4.遍历链表
void showLinkList(link_node_t *p);
// 5.链表指定位置删除数据
int deletePostLinkList(link_node_t *p, int post);
// 6.判断链表是否为空
int isEmptyLinkList(link_node_t *p);
// 7.清空单向链表
void clearLinkList(link_node_t *p);
// 8.修改指定位置的数据 post 被修改的位置 data修改成的数据
int changePostLinkList(link_node_t *p, int post, datatype data);
// 9.查找指定数据出现的位置 data被查找的数据 //search 查找
int searchDataLinkList(link_node_t *p, datatype data);
// 10.删除单向链表中出现的指定数据,data代表将单向链表中出现的所有data数据删除
int deleteDataLinkList(link_node_t *p, datatype data);
int main()
{
}
// 创建一个空的有头单向链表
link_node_t *createEmptyLinkList()
{
link_list_t p = (link_list_t)malloc(sizeof(link_node_t));
if (p == NULL)
{
perror("createEmptyLinkList malloc err");
return NULL;
}
p->next = NULL;
return p;
}
// 写入数据
void tou(link_list_t p, int n)
{
int i = 0;
while (i < n)
{
while (p->next != NULL)
{
p = p->next;
}
link_list_t q = (link_list_t)malloc(sizeof(link_node_t));
p->next = q;
q->next = NULL;
scanf("%d", &q->data);
i++;
}
}
// 链表指定位置插入数据
int insertIntoPostLinkList(link_node_t *p, int post, datatype data)
{
int i = 0;
while (i < post)
{
p = p->next;
i++;
}
link_list_t q = (link_list_t)malloc(sizeof(link_node_t));
q->next = p->next;
q->data = data;
p->next = q;
}
// 链表长度
int lengthLinkList(link_node_t *p)
{
int i = 0;
while (p->next != NULL)
{
p = p->next;
i++;
}
return i;
}
// 遍历链表
void showLinkList(link_node_t *p)
{
while (p->next != NULL)
{
p = p->next;
printf("%d", p->data);
}
printf("\n");
}
// 删除指定位置
int deletePostLinkList(link_node_t *p, int post)
{
if (post < 0 || post >= lengthLinkList(p) || p->next == NULL)
{
return -1;
}
int i = 0;
while (i < post)
{
p = p->next;
if (i == post - 1)
{
link_list_t q = p->next;
p->next = q->next;
free(q);
}
i++;
}
}
int isEmptyLinkList(link_node_t *p)
{
return p->next == NULL;
}
// 清空数据
void clearLinkList(link_node_t *p)
{
link_list_t q = NULL;
while (p->next != NULL)
{
q = p->next;
p->next = q->next;
free(q);
}
}
// 修改数据
int changePostLinkList(link_node_t *p, int post, datatype data)
{
if (post < 0 || post >= lengthLinkList(p))
{
return -1;
}
int i = 0;
while (i <= post)
{
p = p->next;
if (i = post)
{
p->data = data;
}
i++;
}
}
// 查找指定的数据
int searchDataLinkList(link_node_t *p, datatype data)
{
int i = 0;
while (p->next != NULL)
{
if (p->data == data)
{
return i;
}
else
{
p = p->next;
}
i++;
}
return -1;
}
int deleteDataLinkList(link_node_t *p, datatype data)
{
link_list_t q;
while (p->next != NULL)
{
if (p->next->data == data)
{
q = p->next;
p->next = p->next->next;
free(q);
}
else
{
p = p->next;
}
}
}