linklist.h
#ifndef _LINKLIST_H_
#define _LINKLIST_H_typedef int data_t;typedef struct node{
data_t data;
struct node *next;
}NODE;NODE *linklist_create();int linklist_is_empty(NODE *head);
int linklist_is_full(NODE *head);int linklist_length(NODE *head);
void linklist_clear(NODE *head);int linklist_insert(NODE *head, data_t data, int offset);int linklist_data_delete(NODE *head, data_t data);
int linklist_offset_delete(NODE *head, int offset);int linklist_data_change(NODE *head, data_t old_data, data_t new_data);
int linklist_offset_change(NODE *head, data_t data, int offset);int linklist_data_search(NODE *head, data_t data);
//NODE *linklist_data_search(NODE *head, data_t data);
data_t linklist_offset_search(NODE *head, int offset);void linklist_show(NODE *head);
void linklist_destory(NODE **head);void linklist_invert(NODE *head);#endif
linklist.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>#include "linklist.h"NODE *linklist_create()
{
NODE *head = (NODE *)malloc(sizeof(NODE));
if (NULL == head) {
printf("malloc failed!\n");
return NULL;
}
bzero(head, sizeof(NODE)); head->data = -;
head->next = NULL; return head;
}int linklist_is_empty(NODE *head)
{
/*
if (NULL == head->next) {
return 1;
}
return 0;
*/ return head->next == NULL;
}int linklist_is_full(NODE *head)
{
return ;
}int linklist_length(NODE *head)
{
NODE *p = head->next;
int len = ; while (NULL != p) {
len++;
p = p->next;
} return len;
}void linklist_clear(NODE *head)
{
NODE *p = head->next;
NODE *q = NULL; while (NULL != p) {
q = p->next;
free(p);
p = q;
} head->next = NULL;
}int linklist_insert(NODE *head, data_t data, int offset)
{
/*判断插入的位置是否有效*/
int len = linklist_length(head);
if ( > offset || offset > len) {
printf("offset invalid!\n");
return -;
} /*给想要插入的元素开辟空间,并赋值*/
NODE *p = (NODE *)malloc(sizeof(NODE));
if (NULL == p) {
printf("malloc failed!\n");
return -;
}
bzero(p, sizeof(NODE)); p->data = data;
p->next = NULL; /*找到插入位置的前一个位置*/
NODE *q = head;
int i;
for (i = ; i < offset; i++) {
q = q->next;
} /*在找到的位置后面插入结点*/
p->next = q->next;
q->next = p; return ;
}int linklist_data_delete(NODE *head, data_t data)
{
/*找到想要删除的元素的位置*/
int offset = linklist_data_search(head, data);
if (- == offset) {
printf("search failed!\n");
return -;
} /*查找删除位置的前一个位置*/
NODE *p = head;
int i;
for (i = ; i < offset; i++) {
p = p->next;
}
#if 0
NODE *p = head;
while (NULL != p->next) {
if (p->next->data == data) {
break;
}
p = p->next;
}
if (p->next == NULL) {
return -;
}
#endif /*让删除位置的前一个结点指向后一个结点的位置*/
NODE *q = p->next;
p->next = q->next; /*释放这个位置*/
free(q);
q = NULL; return ;
}int linklist_offset_delete(NODE *head, int offset)
{
/*判断offset的值是否有效*/
int len = linklist_length(head);
if ( > offset || offset > len-) {
printf("offset invalid!\n");
return -;
} /*查找删除位置的前一个位置*/
NODE *p = head;
int i;
for (i = ; i < offset; i++) {
p = p->next;
} /*让删除位置的前一个结点指向后一个结点的位置*/
NODE *q = p->next;
p->next = q->next; /*释放这个位置*/
free(q);
q = NULL; return ;
}int linklist_data_change(NODE *head, data_t old_data, data_t new_data)
{
/*找到想要修改元素的位置*/
int offset = linklist_data_search(head, old_data);
if (- == offset) {
printf("search failed!\n");
return -;
} /*直接修改这个数据*/
NODE *p = head->next;
int i;
for (i = ; i < offset; i++) {
p = p->next;
} p->data = new_data; return ;
}int linklist_offset_change(NODE *head, data_t data, int offset)
{
/*判断offset的值是否有效*/
int len = linklist_length(head);
if ( > offset || offset > len-) {
printf("offset invalid!\n");
return -;
} /*直接修改这个数据*/
NODE *p = head->next;
int i;
for (i = ; i < offset; i++) {
p = p->next;
} p->data = data; return ;
}int linklist_data_search(NODE *head, data_t data)
{
/*从第一个有效数据开始查找, 直到表结束,找到则返回查找到的位置*/
NODE *p = head->next;
int offset = ; while (NULL != p) {
if (data == p->data) {
return offset;
}
offset++;
p = p->next;
} return -;
}
/*
NODE *linklist_data_search(NODE *head, data_t data)
{
从第一个有效数据开始查找, 直到表结束,找到则返回查找到的位置
NODE *p = head->next; while (NULL != p) {
if (data == p->data) {
return p;
}
p = p->next;
} return NULL;
}
*/
data_t linklist_offset_search(NODE *head, int offset)
{
/*判断offset的值是否有效*/
int len = linklist_length(head);
if ( > offset || offset > len-) {
printf("offset invalid!\n");
return -;
} /*找到这个位置,并返回这个位置的值*/
NODE *p = head->next;
int i;
for (i = ; i < offset; i++) {
p = p->next;
} return p->data;
}void linklist_show(NODE *head)
{
NODE *p = head->next; while (NULL != p) {
printf("%d, ", p->data);
p = p->next;
}
printf("\n");
}void linklist_destory(NODE **head)
{
linklist_clear(*head); free(*head);
*head = NULL;
}void linklist_invert(NODE *head)
{
NODE *p = head;
NODE *q = head->next;
p->next = NULL;//意思是第一个插入的元素的指针位已经是空了(因为头插法第一个插入的元素会变成最后一个元素。) NODE *t = NULL; while (NULL != q) {
t = q->next; q->next = p->next;
p->next = q; q = t;
}
}
调用main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>#include "linklist.h"int main()
{
NODE *head = linklist_create(); if (NULL == head) {
printf("create failed!\n");
return -;
} int n = ;
while (n--) {
if (- == linklist_insert(head, n+, )) {
printf("insert failed!\n");
break;
}
}
linklist_show(head); if (- == linklist_insert(head, , )) {
printf("insert failed!\n");
return -;
}
linklist_show(head); if (- == linklist_data_change(head, , )) {
printf("change data failed!\n");
return -;
}
linklist_show(head); if (- == linklist_offset_change(head, , )) {
printf("change offset failed!\n");
return -;
}
linklist_show(head); if (- == linklist_data_delete(head, )) {
printf("change data failed!\n");
return -;
}
linklist_show(head); if (- == linklist_offset_delete(head, )) {
printf("change offset failed!\n");
return -;
}
linklist_show(head); linklist_invert(head);
linklist_show(head); linklist_destory(&head); return ;
}