
正文
C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
1、数据结构-单链表的实现-C语言
typedef struct LNode{ int data; struct LNode* next;} LNode,*LinkList; //这两者等价。LinkList这样方便理解void Show_Help();//初始化线性表void InitList(LinkList *L);//销毁线性表void DestroyList(LinkList *L);//清空线性表void ClearList(LinkList *L);//线性表是否为空int ListEmpty(LinkList *L);//线性表长度int ListLength(LinkList *L);//线性表查找void GetElem(LinkList L,int i);//返回相同元素的位置void LocateElem(LinkList L,int e);//求前驱void PriorElem(LinkList L,int previous);//求后继void NextElem(LinkList L,int next);//插入元素void ListInsert(LinkList *L,int key,int value);//删除元素void ListDelete(LinkList *L,int key);//显示线性表中元素void TraverList(LinkList L);//线性表翻转//--------------------------------------------------------------------void Show_Help(){ printf("1---初始化单链表\n"); printf("2---销毁单链表\n"); printf("3---置空单链表\n"); printf("4---判断单链表是否为空\n"); printf("5---求单链表长度\n"); printf("6---获取单链表某位置元素\n"); printf("7---请输入元素的值,判断其在单链表中是否存在,并返回其下标,不存在则返回0\n"); printf("8---求直接前驱\n"); printf("9---求直接后继\n"); printf("10---插入元素\n"); printf("11---删除元素\n"); printf("12---显示单链表全部元素\n"); printf("13---翻转单链表全部元素\n"); printf("14---演示单链表的并操作\n"); printf("退出,输入一个负数\n");}void InitList(LinkList *L){ *L = (LNode*) malloc(sizeof(LNode)); //生成头结点,并用L指针指向头结点 if(!(*L)){ printf("分配失败\n"); return ; } (*L)->next = NULL;}void DestroyList(LinkList *L){ //销毁时要从头到尾都删除 LinkList cut; while(*L){ cut = *L; *L = (*L)->next; free(cut); }}void ClearList(LinkList *L){ //把除了头结点的其他全删除 LinkList cut=(*L)->next; LinkList middle; while(cut){ middle = cut->next; free(cut); cut = middle; }}int ListEmpty(LinkList *L){ if((*L)->next == NULL) return 1; else return 0;}int ListLength(LinkList *L){ int num = 0; LNode* middle = (*L); while(middle->next){ num++; middle = middle->next; } return num;}void GetElem(LinkList L,int i){ LinkList middle = L->next; int key = 1; int value; while(middle && key<i){ middle = middle->next; key++; } if(key>i || middle==NULL){ printf("输入范围有误,请重新选择。\n"); return; } value = middle->data; printf("位于第%d个位置的值为:%d\n",i,value);}void LocateElem(LinkList L,int value){ LinkList middle = L->next; int key = 0; int num = 1; while(middle){ middle = middle->next; num++; if(middle->data == value){ key = num; break; } } if(key) printf("%d在单链表中下标为%d\n",value,key); else printf("%d在单链表中不存在\n",value);}void PriorElem(LinkList L,int previous){ if(previous == 1){ printf("第一个元素没有前驱,请重新选择。\n"); return; } LinkList middle = L->next; int num = 1; int value; while(num<(previous-1) && middle){ num++; middle = middle->next; } if(middle==NULL || num>(previous-1)){ printf("输入范围有误,请重新选择。\n"); return; } value = middle->data; printf("第%d个位置的前驱为:%d\n",previous,value);}void NextElem(LinkList L,int next){ LinkList middle = L->next; int num = 1; int value; while(num<(next+1) && middle){ num++; middle = middle->next; } if(middle==NULL || num>(next+1)){ printf("输入范围有误,请重新选择。\n"); return; } if(num == next){ printf("最后一个元素没有后继,请重新选择。\n"); return; } value = middle->data; printf("第%d个位置的后继为:%d\n",next,value);}void ListInsert(LinkList *L,int key,int value){ LinkList middle = (*L); int num = 0; while(num<key-1 && middle){ num++; middle = middle->next; } if(middle==NULL || num>key-1){ printf("输入范围有误,请重新选择。\n"); return; } LinkList insert; insert = (LNode*) malloc(sizeof(LNode)); //给要插入的结点分配空间 insert->next = middle->next; insert->data = value; middle->next = insert;}void ListDelete(LinkList *L,int key){ LinkList cut = (*L)->next; int num = 1; while(num<key && cut){ num++; cut = cut->next; } if(!cut || num>=key){ printf("输入范围有误,请重新选择。\n"); return; } LinkList middle = cut->next; cut->next = middle->next; free(middle);}void TraverList(LinkList L){ printf("单链表所有元素有:"); int num = 1; LinkList value = L->next; while(value){ printf("%d ",value->data); value = value->next; } printf("\n");}void Filp(LinkList* L){ LinkList q = (*L)->next; LinkList p = q->next; while(p){ q->next = p->next; p->next = (*L)->next; (*L)->next = p; p = q->next; } printf("翻转成功\n");}






