您的位置:首页 > 理论基础 > 数据结构算法

工大数据结构之实验指导之【一】单链表的操作

2015-01-11 00:00 399 查看

题目

1. 单链表的插入和删除 :要求单链表的数据域是字符串,完成单链表的初始化、插入、删除操作,插入时不允许重复的串插入表中。

文件布局:

PS D:\code\gongda\datastruct\data_2_1> tree /f
卷 软件 的文件夹 PATH 列表
卷序列号为 0007-DC50
D:.
│  .cproject
│  .project
│  Makefile
│
├─include
│      list.h
│
└─src
list.c
Main.c

PS D:\code\gongda\datastruct\data_2_1>


list.h

单链表结构及操作定义

/** @file list.h
* 功能:辽工大之该死的数据结构之报告之一:单链表的操作
* 时间:2015年1月11日18:56:53
* 作者:小代码
*/

#ifndef INCLUDE_LIST_H_
#define INCLUDE_LIST_H_

/** @struct 单链表结构定义
*
*/
struct _list{
/** 数据域  */
char str[20];

/** 指针域  */
struct _list * next;
};

typedef struct _list list;
typedef struct _list * listPtr;

/** @brief 链表的初始化
*
* @return
*/
listPtr list_init();

/** @brief 链表的插入
* 尾插法
*
* @param l 要插入元素的单链表
* @param str 要插入的元素的字符串
*
* @pre 链表 l 存在 且字符串 str 不存在于链表中
*
* @retval 0 插入成功
* @retval 1 插入失败
*
*/
int list_append( listPtr l , char str[20]);

/** @brief 链表的删除
*
* @param l 要删除元素的链表
* @param str 要删除的结点的字符串
*
* @pre 链表 l 存在 且字符串 str 存在于链表中
*
* @retval 0 删除成功
* @retval 1 删除失败,字符串str不存在于链表中
* @retval -1 链表 l 不存在 或链表为空
*/
int list_delete( listPtr l, char str[20]);

/** @brief 检测字符串 str 是否存在于链表l 中
*
* @param l 链表
* @param str 要检测的字符串
*
* @pre 链表 l 存在且不为空
*
* @retval 0 存在
* @retval 1 不存在
* @retval -1 链表不存在或链表为空
*/
int list_has_str( listPtr l, char str[20] );

/** @brief 检测链表是否为空
*
* @param l 链表
*
* @pre 链表 l 存在
*
* @retval 0 链表为空
* @retval 1 链表不为空
* @retval -1 链表不存在
*/
int list_is_empty( listPtr l );

/** @brief 输出链表
*
* @param l 要输出的链表
*
* @pre 链表 l 存在
*
* @retval 0 输出成功
* @retval 1 链表为空
* @retval -1 链表不存在
*
*/
int list_print( listPtr l );

/** @brief 销毁链表
*
* @param l 要销毁的链表
*
* @pre 链表 l 存在
*
* @retval 0 销毁成功
* @retval 1 销毁失败
*/
int list_destroy( listPtr l );

#endif /* INCLUDE_LIST_H_ */


list.c

单链表操作实现

/*
* list.c
*
*  Created on: 2015年1月11日
*      Author: laolang
*/

#include"../include/list.h"
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

/** @brief 链表的初始化
*
* @return
*/
listPtr list_init() {
listPtr l = (listPtr) malloc(sizeof(list));
if ( NULL == l) {
puts("动态分配内存失败!list_init...l");
exit(-1);
}

l->next = NULL;

return l;
}

/** @brief 链表的插入
* 尾插法
*
* @param l 要插入元素的单链表
* @param str 要插入的元素的字符串
*
* @pre 链表 l 存在 且字符串 str 不存在于链表中
*
* @retval 0 插入成功
* @retval 1 插入失败
*
*/
int list_append(listPtr l, char str[20]) {
int result = 0;

if (!list_has_str(l, str)) {
printf("字符串:\"%s\"已存在于链表中\n",str);
result = 1;
} else {

listPtr p = l;
listPtr newData = (listPtr) malloc(sizeof(list));
newData->next = NULL;
strcpy(newData->str, str);

while ( NULL != p->next) {
p = p->next;
}

p->next = newData;
}

return result;
}

/** @brief 链表的删除
*
* @param l 要删除元素的链表
* @param str 要删除的结点的字符串
*
* @pre 链表 l 存在 且字符串 str 存在于链表中
*
* @retval 0 删除成功
* @retval 1 删除失败,字符串str不存在于链表中
* @retval -1 链表 l 不存在 或链表为空
*/
int list_delete(listPtr l, char str[20]) {
int result = 0;

if ( NULL == l || !list_is_empty(l)) {
result = -1;
} else {
listPtr p = l;
listPtr deleteP = NULL;
while ( NULL != p->next) {
if (!strcmp(p->next->str, str)) {
deleteP = p;
break;
}
p = p->next;
}

if ( NULL != deleteP) {
p->next = p->next->next;
free(deleteP);
} else {
result = 1;
}
}

return result;
}

/** @brief 检测字符串 str 是否存在于链表l 中
*
* @param l 链表
* @param str 要检测的字符串
*
* @pre 链表 l 存在且不为空
*
* @retval 0 存在
* @retval 1 不存在
* @retval -1 链表不存在或链表为空
*/
int list_has_str(listPtr l, char str[20]) {
int result = 1;

if ( NULL == l || !list_is_empty(l)) {
result = -1;
} else {
listPtr p = l->next;

while ( NULL != p) {
if (!strcmp(p->str, str)) {
result = 0;
break;
}
p = p->next;
}
}

return result;
}

/** @brief 检测链表是否为空
*
* @param l 链表
*
* @pre 链表 l 存在
*
* @retval 0 链表为空
* @retval 1 链表不为空
* @retval -1 链表不存在
*/
int list_is_empty(listPtr l) {
int result = 0;
if ( NULL == l) {
puts("链表不存在");
result = -1;
}

if ( NULL != l->next) {
result = 1;
}

return result;
}

/** @brief 输出链表
*
* @param l 要输出的链表
*
* @pre 链表 l 存在
*
* @retval 0 输出成功
* @retval 1 链表为空
* @retval -1 链表不存在
*
*/
int list_print(listPtr l) {
int result = 0;

if ( NULL == l) {
result = -1;
} else {
if (!list_is_empty(l)) {
result = 1;
} else {
listPtr p = l->next;

while ( NULL != p) {
printf("%s\n", p->str);
p = p->next;
}
}
}

return result;
}

/** @brief 销毁链表
*
* @param l 要销毁的链表
*
* @pre 链表 l 存在
*
* @retval 0 销毁成功
* @retval 1 销毁失败
*/
int list_destroy( listPtr l ){
int result = 0;

if( NULL == l ){
result = 1;
}else{
listPtr p = l->next;
while( NULL != p ){
listPtr t = p;
p = p->next;
free(t);
}

free(p);
}

return result;
}


Main.c

主文件

/*
* Main.c
*
*  Created on: 2015年1月11日
*      Author: laolang
*/

#include"../include/list.h"
#include<stdio.h>

int main(void) {
listPtr head = list_init();

list_append(head,"小代码");
//添加重复的字符串
list_append(head,"小代码");

list_append(head,"老狼");
list_append(head,"陈");
list_append(head,"李");

//输出链表
list_print(head);

//删除链表中字符串为 小代码 的结点
list_delete(head,"小代码");

puts("删除字符串为:\"小代码\"的结点之后的链表");

//输出链表
list_print(head);

if( !list_destroy(head)){
puts("链表已销毁");
}

return 0;
}


Makefile

# 功能:工大数据结构报告一:单链表操作
#
# 时间:2015年1月11日19:32:07
#
# 作者:小代码
#
#
#
#
program=test.exe

CC=gcc
CFLAGS=-Wall -I include

RM=del

vpath %.h include
vpath %.c src

DIR:=$(wildcard *.c ./src/*.c)
SOURS:=$(notdir $(DIR))
OBJS:=$(patsubst %.c,%.o,$(SOURS))

all:$(program)

$(program):$(OBJS)
$(CC) -o $@ $^

Main.o:list.h

list.o:list.h

.PHNOY:clean run list

clean:
-$(RM) $(OBJS) $(program)

run: $(program)
./$(program)

list:
@echo $(DIR)
@echo $(SOURS)
@echo $(OBJS)


运行效果

PS D:\code\gongda\datastruct\data_2_1> make run
gcc -Wall -I include   -c -o Main.o src/Main.c
gcc -Wall -I include   -c -o list.o src/list.c
gcc -o test.exe Main.o list.o
./test.exe
字符串:"小代码"已存在于链表中
小代码
老狼
陈
李
删除字符串为:"小代码"的结点之后的链表
老狼
陈
李
链表已销毁
PS D:\code\gongda\datastruct\data_2_1>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: