这个程序的主要作用是实现单链表的基本操作也作为这个类别的开始 毕竟这是最简单的数据结构了
实现功能有查找、插入、删除、逆转、销毁、显示拥有完整的接口 可以自由扩展
头文件
/*
**线性表的 头文件主要用于函数的定义以及类型的定义
**2013-08-14
*/
#ifndef list_h_
#define list_h_
#include<stdbool.h>
typedef int datatype;
typedef struct node
{
datatype value;
struct node *next;
}Node,*node;
//初始化
void InitList(node list);
//插入
bool AddItem(datatype value,node list);
//删除
bool DelItem(datatype value,node list);
//判断是否空
bool ListIsEmpty(const node list);
//查找
int Find(const datatype value,const node list);
//转置
void Revert(node list);
//显示
void Show(const node list);
//清空
void EmptyIsList(node list);
#endif
list.c
/*
**函数的实现
**2013-08-14
*/
#include"list.h"
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
/*初始化链表 将链表的next节点指向NULL;*/
void InitList(node list)
{
list->next=NULL;
}
/*插入一个值 这里采用的是尾插法*/
/*成功返回ture 否则返回false*/
bool AddItem(datatype value,node list)
{
node p=list;
while(p->next!=NULL)
p=p->next;
node new=(node)malloc(sizeof(Node));
if(NULL==new)
return false;
new->value=value;
new->next=NULL;
p->next=new;
//puts("ture");
}
void Show(node list)
{
node p;
for(p=list->next;p!=NULL;p=p->next)
printf("%4d",p->value);
printf("\n");
}
/*删除
基本思想是使用两个指针一个是主线保存删除操作后的链表
一个用来遍历整个链表
遍历指针的值等于要删除的值时主线指针指向遍历指针的下一跳
free掉遍历指针然后将遍历指针等于主线指针的下一跳 继续找相同的值
当遍历指针等于NULL的时候 遍历结束 删除结束*/
bool DelItem(datatype value,node list)
{
node p=list,q=list->next;
while(q!=NULL){
if(q->value==value){
p->next=q->next;
free(q);
q=p->next;
}
else{
p=p->next;
q=q->next;
}
}
}
bool ListIsEmpty(node list)
{
if(NULL==list)
return true;
else
return false;
}
int Find( const datatype value,const node list)
{
if(ListIsEmpty(list)){
puts("链表为空");
return -1;
}
int count=1;
node p=list->next;
while(p!=NULL){
if(p->value==value){
return count;
}
else{
count+=1;
p=p->next;
}
}
puts("没有这个值!");
return 0;
}
/*转置
转置的基本思想是
*/
void Revert(node list)
{
if(ListIsEmpty(list)){
puts("链表为空");
}
node p=list->next,q;
list->next=NULL;
while(p!=NULL){
q=p->next;
p->next=list->next;
list->next=p;
p=q;
}
}
main.c
/*
*main 函数 主要是调用函数 完成各种功能
**2013-08-14
*/
#include"list.h"
#include<stdlib.h>
#include<stdbool.h>
#include<stdio.h>
int main(void)
{
node head=(node)malloc(sizeof(Node));
InitList(head);
datatype i;
for (i=1;i<=10;i++){
AddItem(i,head);
}
Show(head);
DelItem(5,head);
Show(head);
Revert(head);
Show(head);
printf("%d",Find(4,head));
}
Makefile
all: list clear
list: main.o list.o
gcc -o list main.o list.o
main.o: main.c list.h
gcc -c main.c
list.o: list.c list.h
gcc -c list.c
clear:
rm *.o