别摸我的键盘 的学生作业:
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_empty_linklist();
extern void insert_head_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.c
#include "linklist.h"
/*
*初始化链表节点
*/
linknode_t *create_empty_linklist(){
linknode_t * l = (linknode_t *)malloc(sizeof(linknode_t));
if(NULL == l){
printf("linknode init fail!\n");
return NULL;
}
memset(l, 0, sizeof(linknode_t));
return l;
}
void insert_head_linklist(linknode_t *head, datatype_t data){
if(NULL == head){
printf("linklist head insert param exception");
}
//申请新节点内存
linknode_t * temp_p = (linknode_t *)malloc(sizeof(linknode_t));
//数据域赋值
temp_p -> data = data;
//插入新节点
temp_p -> next = head -> next;
head -> next = temp_p;
}
void insert_tail_linklist(linknode_t *head, datatype_t data){
if(NULL == head){
printf("linklist tail insert param exception");
}
//申请新节点内存
linknode_t * temp_p = (linknode_t *)malloc(sizeof(linknode_t));
//数据域赋值
temp_p -> data = data;
linknode_t * p = head;
while(p -> next != NULL){
p = p -> next;
}
//插入新节点
temp_p -> next = p -> next;
p -> next = temp_p;
}
void insert_order_linklist(linknode_t *head, datatype_t data){
if(NULL == head){
printf("linklist order insert param exception");
}
//申请新节点内存
linknode_t * temp_p = (linknode_t *)malloc(sizeof(linknode_t));
//数据域赋值
temp_p -> data = data;
linknode_t * p = head;
while(p -> next != NULL && p -> next -> data >= data){
p = p -> next;
}
//插入新节点
temp_p -> next = p -> next;
p -> next = temp_p;
}
void printf_data_linklist(linknode_t *head){
if(NULL == head){
printf("linklist print fail \n");
}
linknode_t * p = head;
while(p->next != NULL){
p = p->next;
printf("%d ", p -> data);
}
printf("\n");
}
/*
*链表是否为空
*/
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, *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 == 1){
return 1;
}else{
return -2;
}
}
/*
*
* 反转单向链表
*/
void reverse_data_linklist(linknode_t * head){
linknode_t *p = NULL;
linknode_t *q = NULL;
//将p节点指向第二个有效节点
p = head -> next -> next;
//将第一个有效节点的next指针域置为null
head -> next -> next = NULL;
while(p != NULL){
q = p -> next;
p -> next = head -> next;
head -> next = p;
p = q;
}
}
/*
*清空链表
*/
void clean_up_linklist(linknode_t *head){
linknode_t * p = NULL;
linknode_t * q = NULL;
p = head;
while(p != NULL){
printf_data_linklist(p);
q = p -> next;
free(p);
p = q;
}
}
main.c
#include "linklist.h"
int main(int argc, const char *argv[])
{
int cnt = 0, num = 0;
linknode_t *head = create_empty_linklist();
printf("请输入要插入链表的节点个数:");
scanf("%d", &cnt);
for(int i = 0; i < cnt; i ++){
scanf("%d", &num);
//insert_head_linklist(head, num);
insert_tail_linklist(head, num);
//insert_order_linklist(head, num);
}
printf_data_linklist(head);
#if 0
datatype_t data;
printf("请输入要删除的数据:");
scanf("%d", &data);
int ret = delete_data_linklist(head, data);
if(ret < 0){
printf("data not found or list empty!\n");
}else{
printf("delete data %d success!\n", data);
}
printf_data_linklist(head);
#endif
reverse_data_linklist(head);
printf_data_linklist(head);
clean_up_linklist(head);
return 0;
}
代码执行
linux@linux:~/test/5-1/linklist$ ./a.out
请输入要插入链表的节点个数:5
1 5 3 7 9
1 5 3 7 9
9 7 3 5 1
9 7 3 5 1
7 3 5 1
3 5 1
5 1
1