【数据结构作业】写链表- -

来源:互联网 发布:男士内增高品牌知乎 编辑:程序博客网 时间:2024/05/17 03:48
# include<stdio.h># include<malloc.h># include<stdlib.h>typedef struct LNode{  int data;  struct LNode * next;}LNode, * LinkList;LinkList InitList(void);//创建链表void DestroyList(LNode * pHead);//销毁链表void ClearList(LNode * pHead);//清空链表bool ListEmpty(LNode * pHead);//空表返回TRUE,否则FALSEint ListLength(LNode * pHead);//返回链表长度void GetElem(LNode * pHead, int i, int *e);//用e返回链表中第i个元素的值int LocateElem(LNode * pHead, int e);//返回链表中第一个其值与e相等的元素的位序。若不存在返回0void PriorELem(LNode * pHead, int cur_e, int * a);//若cur_e是链表的元素且不是第一个,则用a返回它的前驱,否则操作失败,a无定义void NextElem(LNode * pHead, int cur_e, int * a);//若cur_e是链表的元素且不是最后一个,则用a返回它的后继,否则操作失败,a无定义void ListInsert(LNode *pHead, int i, int e);//在链表第i个元素之前插入新的元素e,链表长度加1(若i==len+1,则就是在链表末尾插入新元素e)void ListDelete(LNode * pHead, int i, int * e);void ListTraverse(LNode *pHead);//依次输出链表所有数据元素int main(void){    LNode * pHead = NULL;    pHead = InitList();    //printf("%d\n", LocateElem(pHead, 3));    int a;    //NextElem(pHead, 5, &a);    //ListTraverse(pHead);    //ListDelete(pHead, 5, &a);    //ListTraverse(pHead);    //printf("%d\n", a);    //PriorELem(pHead, 2, &a);    //GetElem(pHead, 3, &a);    //printf("%d\n", a);    //ListTraverse(pHead);    //ClearList(pHead);    return 0;}LinkList InitList(void){    int len;    int i;    int val;    LNode * pHead = (LNode *)malloc(sizeof(LNode));    if(NULL==pHead)    {        printf("分配失败,程序终止!\n");        exit(-1);    }    LNode * pTail = pHead;    printf("请输入您需要生成的链表节点的个数: len = ");    scanf("%d", &len);    for(i=0; i<len; i++)    {        printf("请输入第%d个节点的值\n", i+1);        scanf("%d", &val);        LNode * pNew = (LNode *)malloc(sizeof(LNode));        if(NULL==pNew)        {            printf("分配失败,程序终止!\n");            exit(-1);        }        pNew->data = val;        pTail->next = pNew;        pNew->next = NULL;        pTail = pNew;    }    return pHead;}void DestroyList(LNode * pHead){  LNode * p = pHead->next;  while(NULL!=p)  {      LNode *q = p;      p=p->next;      free(q);  }  free(p);  free(pHead);}void ClearList(LNode * pHead){    LNode * p = pHead->next;    while(NULL!=p)    {        LNode * q = p;        p=p->next;        free(q);    }    pHead->next=NULL;}bool ListEmpty(LNode * pHead){    LNode * p=pHead->next;    if(NULL==p)    return true;    else    return false;}int ListLength(LNode * pHead){    int len=0;    LNode * p = pHead->next;    while(NULL!=p)    {        p=p->next;        len++;    }    return len;}void GetElem(LNode * pHead, int i, int * e){    LNode * p = pHead->next;    while(--i)    {        p=p->next;    }    *e = p->data;}int LocateElem(LNode * pHead, int e){    LNode * p = pHead->next;    int num=1;    while(p->next!=NULL&&p->data!=e)    {        p=p->next;        num++;    }    if(num==ListLength(pHead))    return 0;    else    return num;}void PriorELem(LNode * pHead, int cur_e, int *a){   LNode * p = pHead->next;   LNode * q;   while(p&&p->data!=cur_e)   {       q=p;       p=p->next;   }   if(p&&p->data==cur_e)      *a=q->data;   else      printf("操作失败\n");}void NextElem(LNode * pHead, int cur_e, int * a){   LNode * p =pHead->next;   while(p&&p->data!=cur_e)   {       p=p->next;   }   if(p->data==cur_e&&p->next)   *a=p->next->data;   else     printf("操作失败\n");}void ListInsert(LNode *pHead, int i, int e){    int len=ListLength(pHead);    if(len+1<i)    {        printf("error\n");        return;    }    LNode *s=(LNode *)malloc(sizeof(LNode));    s->data=e;    LNode * p=pHead->next;    if(i==1)    {        pHead->next=s;        s->next=p;    }    else if(i==len+1)    {        while(p->next)        {            p=p->next;        }        p->next=s;        s->next=NULL;    }    else    {        i--;        while(--i)        {            p=p->next;        }        s->next=p->next;        p->next=s;    }}void ListDelete(LNode * pHead, int i, int * e){  int len=ListLength(pHead);  if(i>len||i<1)  {      printf("error\n");      return;  }  LNode * p = pHead->next;  LNode * q;  if(i==1)  {      pHead->next=p->next;      *e=p->data;      free(p);  }  else  {    while(--i)    {       q=p;       p=p->next;    }    q->next=p->next;    *e=p->data;    free(p);  }}void ListTraverse(LNode *pHead){  LNode * p = pHead->next;  while(NULL!=p)  {      printf("%d ", p->data);      p = p->next;  }  printf("\n");  return;}