不能說的PP 的學生作業(yè):
linklist.h:
#ifndef LINKLIST_H
#define LINKLIST_H
#include
#include
#include
typedef int datatype_t;
typedef struct node
{
datatype_t data; //數(shù)據(jù)域保存有效數(shù)據(jù)
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”
//1.創(chuàng)建空的鏈表—為頭結點在堆區(qū)分配空間
linknode_t *create_empty_linklist()
{
linknode_t *head = NULL;
//1.1 分配堆區(qū)空間
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;
//head->data = 0;
return head;
}
//2.頭插法:每次都在頭結點后插入數(shù)據(jù)
//特點:插入的順序和輸出的順序是相反的
void insert_head_linklist(linknode_t *head,datatype_t data)
{//2.1 為結點在堆區(qū)申請空間
linknode_t *temp = (linknode_t *)malloc(sizeof(linknode_t));
if(NULL == temp)
{
printf(“malloc is fail!\n”);
return ;
}
//2.2 插入數(shù)據(jù)
temp->data = data;
//2.3 連接結點
temp->next = head->next;
head->next = temp;
return ;
}
//尾插法:每次都在尾結點后插入數(shù)據(jù)
void insert_tail_linklist(linknode_t *head,datatype_t data)
{//2.1 尾結點在堆區(qū)申請空間
linknode_t *temp = (linknode_t *)malloc(sizeof(linknode_t));
if(NULL == temp)
{
printf(“malloc is fail!\n”);
return ;
}
//2.2 插入數(shù)據(jù)
temp->data = data;
//2.3 找到結尾點
linknode_t *p = head;
while(p->next != NULL)
{
p = p->next;
}
//2.4 連接結點
temp->next = p->next;
p->next = temp;
return ;
}
//有序插入法:每次都在尾結點后插入數(shù)據(jù)
void insert_order_linklist(linknode_t *head,datatype_t data)
{//2.1 尾結點在堆區(qū)申請空間
linknode_t *temp = (linknode_t *)malloc(sizeof(linknode_t));
if(NULL == temp)
{
printf(“malloc is fail!\n”);
return ;
}
//2.2 插入數(shù)據(jù)
temp->data = data;
linknode_t *p = head;
//2.3 p指針向后遍歷
while(p->next != NULL && data < p->next->data)
{
p = p->next;
}
//在p結點后插入temp結點
temp->next = p->next;
p->next = temp;
return ;
}
//3.輸出鏈表中的內(nèi)容
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,保存第二個有效結點的地址,再把第一個有效結點的指針域設置為NULL
p = head->next->next;
head->next->next = NULL;
//2.從p結點后,利用頭插法的思想在頭結點后插入數(shù)據(jù)
// q保存p后一個結點的地址
while(p != NULL)
{
q = p->next;
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 ;
}
main.c:
#include “linklist.h”
int main()
{
linknode_t *head = NULL;
datatype_t data;
int n = 0,i = 0;
int ret = 0;
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 < n;i++)
{
scanf("%d",&data);
//insert_head_linklist(head,data);
//insert_tail_linklist(head,data);
insert_order_linklist(head,data);
}
printf_data_linklist(head);
#if 0
printf(“please input you want delete data : “);
scanf(”%d”,&data);
ret = delete_data_linklist(head,data);
if(ret < 0)
{
printf("data is not exist or is empty!\n");
return -1;
}
printf_data_linklist(head);
#endif
//reverse_data_linklist(head);
//printf_data_linklist(head);
printf("==========================\n");
clean_up_linklist(head);
return 0;
}