1.2数据结构->线性表->链表

来源:互联网 发布:mac os x 10.7.4升级 编辑:程序博客网 时间:2024/06/06 09:16

参考《大话数据结构》:

环境: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 0typedef 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 programmingsOBJS=linklist.o main.oCC=gccCFLAGS=-Wall -gTARGET=linklistTARGET:$(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:cleanclean:    rm *.o linklist
5、执行结果


0 0
原创粉丝点击