参考《大话数据结构》:
环境:ubuntu16.04 vim
文件名称:sqlist.h sqlist.c main.c Makefile(放到同一个目录下)
实现功能:链表的初始化、头部插入和尾部插入,链表清空和链表遍历
1、linklist.h头文件
#ifndef __LINKLIST_HEAD__
#define __LINKLIST_HEAD__
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
#define OK 0
#define ERROR -1
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
/*单链表的存储结构*/
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList; //定义LinkList
/*
*初始化一个空的节点
*L [IN, OUT]进行操作的链表
*/
extern Status ListInit(LinkList *L);
/*
*新建一个链表节点并插入到头部,俗称头插法
*L [IN, OUT]进行操作的链表
*e [IN]插入到节点的数据
*/
extern Status AddListHead(LinkList *L, ElemType e);
/*
*新建一个链表节点并插入到尾部,俗称尾插法
*L [IN, OUT]进行操作的链表
*e [IN]插入到节点的数据
*/
extern Status AddListTail(LinkList *L, ElemType e);
/*
*将链表置为空表
*L [IN, OUT]要操作的链表
*/
extern Status ClearList(LinkList *L);
/*
*遍历表中的每一个节点
*L [IN]要操作的链表
*/
extern void TraverseList(LinkList L);
#endif
2、linklist.c文件
#include "linklist.h"
/*初始化一个空节点*/
Status ListInit(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(Node));
if ((*L) == NULL)
{
printf("malloc failed!\n");
return ERROR;
}
(*L)->data = 0;
(*L)->next = NULL;
return OK;
}
/*头插法*/
Status AddListHead(LinkList *L, ElemType e)
{
LinkList s;
if (!(*L))
{
return ERROR;
}
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = (*L)->next;
(*L)->next = s;
return OK;
}
/*尾插法*/
Status AddListTail(LinkList *L, ElemType e)
{
LinkList p, s;
p = *L;
if (!p)
{
return ERROR;
}
while (p->next != NULL)
{
p = p->next;
}
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
/*删除整张表*/
Status ClearList(LinkList *L)
{
LinkList p, q;
p = (*L)->next;
while(p)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
printf("链表置为空!\n");
return OK;
}
/*遍历表中的数据*/
void TraverseList(LinkList L)
{
LinkList p;
p = L;
if (p->next == NULL)
{
printf("链表为空表!\n");
}
while(p->next != NULL)
{
printf("p->data:%d\n", p->data);
p = p->next;
}
printf("p->data:%d\n", p->data);
}
3、main.c
#include "linklist.h"
int main()
{
LinkList L = NULL;
if (ListInit(&L))
{
printf("ListInit failed!\n");
return ERROR;
}
/*插入表中一个节点*/
ElemType e = 1;
if (AddListHead(&L, e))
{
printf("Add Node failed!\n");
return ERROR;
}
ElemType f = 2;
if (AddListHead(&L, f))
{
printf("Add Node failed!\n");
return ERROR;
}
/*遍历表中的数据*/
printf("**************\n");
TraverseList(L);
printf("**************\n");
/*尾插法*/
ElemType g = 3;
if (AddListTail(&L, g))
{
printf("Add Node Tail failed!\n");
return ERROR;
}
ElemType h = 4;
if (AddListTail(&L, h))
{
printf("Add Node Tail failed!\n");
return ERROR;
}
/*遍历表中的数据*/
printf("**************\n");
TraverseList(L);
printf("**************\n");
/*将链表置为空*/
if (ClearList(&L))
{
printf("Clear List failed!\n");
return ERROR;
}
/*遍历表中的数据*/
printf("**************\n");
TraverseList(L);
printf("**************\n");
return OK;
}
4、Makefile文件
#Makefile for building programmings OBJS=linklist.o main.o CC=gcc CFLAGS=-Wall -g TARGET=linklist TARGET:$(OBJS) $(CC) $(OBJS) -o $(TARGET) linklist.o:linklist.c linklist.h $(CC) $(CFLAGS) -c $< -o $@ main.o:main.c linklist.h $(CC) $(CFLAGS) -c $< -o $@ .PHONY:clean clean: rm *.o linklist5、执行结果