奔跑的人生 的学生作业:
linklist.h
#ifndef LINKLIST_H
#define LINKLIST_H
#include
#include
#include
typedef int datatype_t;
typedef struct node {
datatype_t data;
struct node *next;
} linknode_t;
extern linknode_t *create_empyt_linklist();
extern void insert_data_linklist(linknode_t *head, datatype_t data);
extern void printf_data_linklist(linknode_t *head);
extern void insert_tail_linklist(linknode_t *head, datatype_t data);
extern void insert_order_linklist(linknode_t *head, datatype_t data);
extern int is_empty_linklist(linknode_t *head);
extern int delete_data_linklist(linknode_t *head, datatype_t data);
extern void reverse_data_linklist(linknode_t *head);
extern void clean_up_linklist(linknode_t *head);
#endif //LINKLIST_H
linklist.c
#include "linklist.h"
linknode_t *create_empyt_linklist() {
linknode_t *head = NULL;
head = (linknode_t *) malloc(sizeof(linknode_t));
if (NULL == head) {
printf("malloc is fail!\n");
return NULL;
}
memset(head, 0, sizeof(linknode_t));
return head;
}
//头插法
void insert_data_linklist(linknode_t *head, datatype_t data) {
linknode_t *temp = (linknode_t *) malloc(sizeof(linknode_t));
if (NULL == temp) {
printf("malloc is fail!\n");
return;
}
temp->data = data;
temp->next = head->next;
head->next = temp;
return;
}
//尾插法
void insert_tail_linklist(linknode_t *head, datatype_t data) {
linknode_t *temp = (linknode_t *) malloc(sizeof(linknode_t));
if (NULL == temp) {
printf("malloc is fail!\n");
return;
}
temp->data = data;
linknode_t *p = head;
while (p->next != NULL) {
p = p->next;
}
temp->next = p->next;
p->next = temp;
return;
}
//有序插法
void insert_order_linklist(linknode_t *head, datatype_t data) {
linknode_t *temp = (linknode_t *) malloc(sizeof(linknode_t));
if (NULL == temp) {
printf("malloc is fail!\n");
return;
}
temp->data = data;
linknode_t *p = head;
while (p->next != NULL && data < p->next->data) {
p = p->next;
}
temp->next = p->next;
p->next = temp;
return;
}
void printf_data_linklist(linknode_t *head) {
linknode_t *p = head;
while (p->next != NULL) {
printf("%d ", p->next->data);
p = p->next;
}
printf("\n");
return;
}
int is_empty_linklist(linknode_t *head) {
return head->next == NULL ? 1 : 0;
}
int delete_data_linklist(linknode_t *head, datatype_t data) {
linknode_t *p = NULL;
linknode_t *q = NULL;
int flag = 0;
if (is_empty_linklist(head)) {
return -1;
}
p = head;
while (p->next != NULL) {
if (p->next->data == data) {
q = p->next;
p->next = q->next;
free(q);
q = NULL;
flag = 1;
}else {
p = p->next;
}
}
if (flag == 0) {
return -2;
}else {
printf("delete %d is successful!\n",data);
return 0;
}
}
void reverse_data_linklist(linknode_t *head)
{
linknode_t *p = NULL;
linknode_t *q = NULL;
//1.p保存第二个有效结点的地址,并且把第一个有效结点
// 的指针域设置为NULL
p = head->next->next;
head->next->next = NULL;
//2.从p结点开始,依次使用头插法的思想,
// 把p结点插入到头结点后面
while(p != NULL)
{
q = p->next; //保存p后面结点的地址
//把p结点存放到head结点后
p->next = head->next;
head->next =p;
p = q;
}
return ;
}
//清除链表,删除链表中所有结点(包括头结点)
void clean_up_linklist(linknode_t *head)
{
//1.思路:删除前一个结点,输出后一个结点的数据
linknode_t *p = head;
linknode_t *q = NULL;
while(p != NULL)
{
q = p->next;
printf_data_linklist(p);
free(p);
p = q;
}
return ;
}
main.c
#include "linklist.c"
int main() {
linknode_t *head = NULL;
datatype_t data;
int n = 0;
int res = 0;
head = create_empyt_linklist();
printf("请输入你想插入的个数:\n");
scanf("%d", &n);
printf("请输入%d个数\n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &data);
// insert_data_linklist(head, data);
insert_tail_linklist(head,data);
// insert_order_linklist(head, data);
}
printf_data_linklist(head);
// printf("删除数据");
// printf("请输入您想要删除的数据:\n");
// scanf("%d", &data);
// res = delete_data_linklist(head, data);
// if (res < 0) {
// printf("没有找到要删除的数据或链表数据为空!\n");
// return -1;
// }
//
// printf_data_linklist(head);
printf("逆序:\n");
reverse_data_linklist(head);
printf_data_linklist(head);
printf("清除:\n");
clean_up_linklist(head);
return 0;
}
【图片】