【数据结构作业】写链表- -
来源:互联网 发布:男士内增高品牌知乎 编辑:程序博客网 时间: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;}