C语言 带头结点的单链表

来源:互联网 发布:2017淘宝虚假交易规则 编辑:程序博客网 时间:2024/06/06 03:43

初学者,有错误请指正,谢谢! 

C语言带头结点的单链表实现:

#include<stdio.h>#include<stdlib.h>#include<time.h>#define elem 0typedef int ElemType;typedef int Status;typedef struct LNode{    ElemType data;    struct LNode *next;}LNode,*PNode;typedef struct List{    PNode head,tail;    int len;}List,*LinkList;//创建结点PNode MakeNode(ElemType e){    PNode p=(PNode)malloc(sizeof(LNode));    if(!p)exit(0);    p->data=e;    p->next=NULL;    return p;}//创建空链表LinkList CreateEmpList(){    LinkList L=(LinkList)malloc(sizeof(LinkList));    if(!L)exit(0);    L->head=NULL;    L->tail=NULL;    L->len=0;    return L;}//链表尾插入元素LinkList AddEnd(LinkList L,PNode p){    if(!L||!p)exit(0);    if(L->len==0){        L->head=p;        L->tail=p;        p->next=NULL;        L->len=1;        return L;    }    L->tail->next=p;    p->next=NULL;    L->tail=p;    ++L->len;    return L;}//链表头插入元素LinkList AddHead(LinkList L,PNode p){    if(!L||!p)exit(0);    if(L->len==0){        L->head=p;        L->tail=p;        p->next=NULL;        L->len=1;        return L;    }    p->next=L->head;    L->head=p;    ++L->len;    return L;}//创建i个结点链表LinkList CreateList(int i){    PNode p=NULL;    LinkList L=NULL;    int j,k;    L=CreateEmpList();    for(j=0;j<i;j++){        //scanf("%d",&k);        k=rand()%81+10;        p=MakeNode(k);        L=AddEnd(L,p);    }    return L;}//链表是否为空Status IsEmpty(LinkList L){    if(!L)exit(0);    if(L->len)       return 0;    return 1;}//返回指定位置结点PNode LocatePos(LinkList L,int pos){    PNode p=L->head;    int i=0;    if(!L||pos>L->len||pos<=0)        return NULL;    for(i=0;i<pos;i++)        p=p->next;    return p;}//插入元素LinkList InsertNode(LinkList L,int pos,ElemType e){    int i;    if(!L||pos<1||pos>L->len)return NULL;    PNode newnode=MakeNode(e);    PNode tp=MakeNode(elem);    tp->next=L->head;    PNode p=tp;    for(i=1;i<pos;++i)        p=p->next;    newnode->next=p->next;    p->next=newnode;    ++L->len;    free(tp);    return L;}//遍历链表void TraverseList(LinkList L){    PNode p=L->head;    if(!L)return ;    while(p){        printf("Element is %d\n",p->data);        p=p->next;    }}//删除表尾元素LinkList DeleteTail(LinkList L){    PNode p=NULL,t=NULL;    if(!L||!L->tail)        exit(0);    p=L->head;    while(p->next->next){        p=p->next;    }    t=p->next;    p->next=NULL;    free(t);    L->tail=p;    --L->len;    return L;}//销毁链表void DestroyList(LinkList L){    PNode q,p=L->head->next;    while(p!=L->tail){        q=p;        p=q->next;        free(q);    }    free(L);    L=NULL;    printf("Destroyed.\n");}int main(){    srand((unsigned)time(NULL));    //LinkList L=CreateEmpList();    //int n=5;    //while(n--)    //    AddEnd(L,MakeNode(rand()%81+10));    LinkList L=CreateList(3);    TraverseList(L);    L=InsertNode(L,2,0);    TraverseList(L);    L=DeleteTail(L);    TraverseList(L);    DestroyList(L);    return 0;}


0 0
原创粉丝点击