史啦啦 的学生作业:
//head.h
#ifndef _HEAD_H__
#define _HEAD_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 printf_data_linklist(linknode_t* head);
extern void insert_head_linklist(linknode_t* head,datatype_t data);
extern void insert_tail_linklist(linknode_t* head,datatype_t data);
extern void insert_order_linklist(linknode_t *head,datatype_t data);
extern void insert_order2_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
#include "linklist.h"
linknode_t* create_empty_linklist()
{
linknode_t* head = NULL;
//为头节点在堆区分配空间,用指针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));
head->next = NULL;
return head;
}
//头插法
void insert_head_linklist(linknode_t* head,datatype_t data)
{
//1.为新节点在堆区分配空间,用指针temp保留
linknode_t* temp = NULL;
temp = (linknode_t*)malloc(sizeof(linknode_t));
//2.吧data数据放到temp节点的数据域
temp->data = data;
//3.把temp节点插入到head节点后面
temp->next = head->next;
head->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;
}
//尾插法
void insert_tail_linklist(linknode_t* head,datatype_t data)
{
//1.为新节点在堆区分配空间,用指针temp保存
linknode_t *temp = NULL;
temp = (linknode_t *)malloc(sizeof(linknode_t));
//2.把data数据放到temp结点的数据域
temp->data = data;
//3.循环遍历找到尾结点
linknode_t *p = head;
while(p->next != NULL)
{
p = p->next;
}
//4.在p后插入temp结点
temp->next = p->next;
p->next = temp;
return ;
}
//有序插入
void insert_order_linklist(linknode_t *head,datatype_t data)
{
//1.为新节点在堆区分配空间,用指针temp保存
linknode_t *temp = NULL;
temp = (linknode_t *)malloc(sizeof(linknode_t));
//2.把data数据放到temp结点的数据域
temp->data = data;
linknode_t *p = head;
while(p->next != NULL && data > p->next->data)
{
p = p->next;
}
//在p结点后插入我们的数据data
temp->next = p->next;
p->next = temp;
return ;
}
//有序插入2
void insert_order2_linklist(linknode_t* head,datatype_t data)
{
//1.为新节点在堆区分配空间,用指针temp保存
linknode_t* temp = NULL;
temp = (linknode_t*)malloc(sizeof(linknode_t));
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;
}
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;
}
}
//若是删除的数据不存在,返回-2
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)
{
linknode_t* p = head;
linknode_t* q = NULL;
while(p != NULL)
{
q = p->next;
printf_data_linklist(p);
free(p);
p = q;
}
return ;
}
#include "linklist.h"
int main(int argc, const char *argv[])
{
linknode_t* head = NULL;
int n = 0,i = 0,ret = 0;
datatype_t data;
head = create_empty_linklist();
printf("please input you want insert data number:");
scanf("%d",&n);
printf("please input %d data:",n);
for(i = 0;i