西卡学院单链表的实现(带空表头的实现)

来源:互联网 发布:e8票据打印软件 编辑:程序博客网 时间:2024/04/30 11:46

    纠结写了一上午没啥进展,把别人的代码贴出来。要努力了的。

    list.h

  

#define NULL 0#define ElementType inttypedef struct _ChainNode{        ElementType data;        struct _ChainNode * next;}ChainNode;typedef struct{        ChainNode * head;        ChainNode * tail;        int total;}List ;List * ListInit();int ListDestory(List * lp);int ListClear(List * lp);int InsertTail(List * lp , ElementType * pdata);int InsertHead(List * lp , ElementType * pdata);int InsertNode(List * lp , int n , ElementType * pdata);int RemoveNode(List * lp , int n);ChainNode * GetChainNode(List * lp , int n);ChainNode * NewChainNode(ElementType * pdata);ChainNode * GetAddr(List * lp , int n);int IsEmpty(List * lp);int GetTotal(List * lp);int ListTraverse(List * lp , int (*fpn)(ElementType * pdata));


list.c实现:

#include "list.h"#include <malloc.h>#include <string.h>#include <stdio.h>ElementType mydata;List * ListInit() {        List * lp = NULL;        ChainNode * newp = NULL;        lp = (List *)malloc(sizeof(List));        if(!lp)        return lp;        newp = NewChainNode(&mydata);        if(!newp)        {           free(lp);           lp = NULL;           return lp;         }        lp->head = lp->tail = newp;        lp->total = 0;        return lp;}int ListDestory(List * lp) {        if(!lp)        {            ListClear(lp);            free(lp->head);            free(lp);        }        return 1;}int ListClear(List * lp){        while(RemoveNode(lp,1));        return 1;}int InsertTail(List * lp , ElementType * pdata) {        ChainNode * newp = NULL;        newp =  NewChainNode(pdata);        if(!newp)        return 0 ;        lp->tail->next = newp;        lp->tail = newp;        lp->total++ ;        return 1 ;}int InsertHead(List * lp , ElementType * pdata) {        ChainNode * newp = NULL;        newp = NewChainNode(pdata);        if(!newp)        return 0;        newp->next = lp->head->next;        lp->head->next = newp;        lp->total++;        return 1;}int InsertNode(List * lp , int n , ElementType * pdata) {        ChainNode * newp = NULL;        ChainNode * p = NULL;        newp = NewChainNode(pdata);        if(!newp)        return 0 ;        p = GetAddr(lp,n-1);        newp->next = p->next;        p->next = newp;        lp->total++;        return 1 ;}int RemoveNode(List * lp , int n) {        ChainNode * p = NULL;        ChainNode * p1 = NULL;        if(IsEmpty(lp) || n < 0 || n > lp->total)        return 0;        p = GetAddr(lp,n-1);        if(!p)        return 0 ;        p1 = p->next;        p->next = p1->next;        free(p1);        lp->total--;        return 1;}ChainNode * GetChainNode(List * lp , int n){        return   GetAddr(lp,n);}ChainNode * NewChainNode(ElementType * pdata){        ChainNode * newp = NULL;        newp = (ChainNode *)malloc(sizeof(ChainNode));                if(!newp)                return newp;        memcpy(&newp->data,pdata,sizeof(ElementType));        newp->next = NULL;        return newp;}ChainNode * GetAddr(List * lp , int n) {        int i;        ChainNode * p = NULL;        if(IsEmpty(lp) || n < 0 || n > lp->total)                return p ;        for(i = 0 ,p = lp->head ; p && i <n ; i++,p = p->next);        return p;}int IsEmpty(List * lp){        return lp->head->next == NULL;}int GetTotal(List * lp){        return lp->total ;        }int ListTraverse(List * lp , int (*fpn)(ElementType * pdata)) {        ChainNode * p = NULL;        for(p = lp->head->next ; p ; p = p->next)        {                fpn(&p->data);        }        printf("\n");        return 1;}


mian函数的调用:

#include "list.h"#include <stdio.h>int showlist(ElementType * pdata){        printf("%d ",*pdata);                return 1;}int main(){        int a[] = {1,2,3,4,5,6,7,8,9,10,11,12};        int data = 99 , data1 =100;        int i = 0 ;        List * lp = ListInit();        if(!lp)        return 0 ;        for(i=0;i<12;i++)        {                InsertTail(lp,a+i);     }                ListTraverse(lp,showlist);        InsertNode(lp,1,&data);        InsertNode(lp,13,&data);        ListTraverse(lp,showlist);        InsertHead(lp,&data1);        ListTraverse(lp,showlist);        printf("Total = %d \n",GetTotal(lp));        printf("GetChainNode No.%d is : %d \n",GetTotal(lp),GetChainNode(lp,GetTotal(lp))->data);        RemoveNode(lp,1);        RemoveNode(lp,13);        RemoveNode(lp,12);        ListTraverse(lp,showlist);        printf("Total = %d \n",GetTotal(lp));        ListClear(lp);        printf("Total = %d \n",GetTotal(lp));        ListDestory(lp);        lp = NULL ;        return 1 ;}