单向链表的操作
来源:互联网 发布:linux redis 编辑:程序博客网 时间:2024/05/21 18:00
#include <iostream>using namespace std;typedef char ElemType;//定义char类型的ElemType,方便修改typedef struct LNode//定义一个结构体{ ElemType data;//链表数据区 LNode *next;//链表指针区}LinkList;void initList(LinkList * & L){ L=(LinkList *)malloc(sizeof(LinkList));//为链表开辟空间 L->next=NULL;//带头节点的顺序链表}void createList (LinkList * &L,ElemType a[],int n)//插入数据{ int i; LinkList *p; for(i=0;i<n;i++)//头插法 ,输出结果是逆序的 { p=(LinkList *)malloc(sizeof(LinkList)); p->data=a[i]; p->next=L->next; p->next=p; }}int locateElem(LinkList *L,ElemType e)//查找元素{ LinkList *p=L->next;//第一个元素 int i=1; while (p&&p->data!=e)//判断链表是否为空,然后查找链表里的元素 { p=p->next; i++; } if(!p)//查找完了,没找到 { cout<<"没有这个元素!"<<endl; return 0; } return i;}void listInsert(LinkList * &L,int i,ElemType e)//插入一个元素{ //[i>=1&&i<=size+1] if(i<=0) { cout<<"无法插入!"<<endl; return; } //1.检查i<=size+1 2.找到插入位置 int j=0; LinkList *p=L,*q; while (p&&j<i-1)//p不存在退出,j>=i-1退出 { j++; p=p->next; } if(!p) { cout<<"无法插入!"<<endl; return; } q=(LinkList *)malloc(sizeof(LinkList));//开辟一个q链表 q->data=e; q->next=p->next; //插入节点 (p插入位置前面一个元素,q需要插入的元素) p->next=q; cout<<"插入完成!"<<endl;}void nixuList(LinkList *&L)//逆序{ LinkList *p,*t,*q; if(L==NULL||L->next==NULL) { cout<<"无法逆序输出!"<<endl; return; } p=L->next; t=p->next; p->next=NULL; while(t)// { q=t->next; t->next=L->next; L->next=t; t=q; }}void listDelete(LinkList * &L,int i)//删除一个元素(位置){ if(i<=0) { cout<<"无法删除!"<<endl; return; } //1.检查i<=size+1 2.找到插入位置 int j=0; LinkList *p=L,*q; while (p&&j<i-1)//p不存在退出,j>=i-1退出 { j++; p=p->next; } if(!p) { cout<<"无法删除!"<<endl; return; } else { //p要删除的元素的前一个 q=p->next;//要删除的对象 if(q==NULL) { cout<<"无法删除!"<<endl; return; } p->next=q->next; free(q); cout<<"删除成功!"<<endl; }}void dispList(LinkList*L){ if(L==NULL||L->next==NULL) { cout<<"链表为空!"<<endl; return; } LinkList *p=L->next; while (p) { printf("%c ",p->data); p=p->next; } putchar('\n');}void destroyList (LinkList *&L)//销毁链表{ LinkList *p=L->next;//指向第一个元素 while (L->next) { L->next=p->next; free(p);//释放原来第一个元素 p=L->next;//p指向第一个元素 } //free(p);//要不要? free(L);//释放head L->next=NULL; cout<<"销毁完成!"<<endl;}int main(int argc, const char * argv[]){ LinkList *p = nullptr; int n,j; printf(" *******************\n"); printf(" 1.创建单链表 \n"); printf(" 2.查找单链表元素 \n"); printf(" 3.插入元素 \n"); printf(" 4.删除元素 \n"); printf(" 5.输出链表元素 \n"); printf(" 6.销毁单链表 \n"); printf(" 7.逆序输出 \n"); printf(" 8.退出 \n"); printf(" *******************\n"); while(1) { printf("选择(1-8):"); scanf("%d",&n); switch(n) { case 1: ElemType elem_create,elem[50]; printf("请输入元素(头插)(字符之间无空格):\n"); getchar(); j=0; while((elem_create=getchar())!='\n') elem[j++]=elem_create; initList(p); createList(p,elem,j); printf("链表创建完成!\n\n"); break; case 2: ElemType elem_search; printf("请输入要查找的元素:"); getchar(); elem_search=getchar(); if(locateElem(p,elem_search)) // if(locateElem(p,elem_search)) printf("要查找的元素是第%d个数据结点\n\n",locateElem(p,elem_search)); else printf("找不到元素%c\n\n",elem_search); break; case 3: int loc_insert; ElemType elem_insert; printf("输入插入位置和元素(逗号隔开):"); scanf("%d,%c",&loc_insert,&elem_insert); listInsert(p,loc_insert,elem_insert); break; case 4: int loc_del; printf("输入删除位置:"); scanf("%d",&loc_del); listDelete(p,loc_del); break; case 5: printf("链表元素有:\n"); dispList(p); putchar('\n'); break; case 6: destroyList(p); break; case 7: printf("逆序输出!\n"); nixuList(p); break; case 8: return 0; default: printf("请输入正确的数字!\n\n"); } } }
0 0
- 单向链表的操作
- 单向链表的操作
- 单向链表的操作
- 单向链表的操作
- 单向链表的操作
- 单向链表的操作
- 单向链表的操作
- 单向链表的操作
- 单向链表,单向循环链表的基本操作
- java对单向单向链表的操作
- 单向链表操作
- 单向链表操作
- 单向链表操作
- 有序单向链表的相关操作
- java 单向链表的操作
- 基本单向链表的操作
- 单向链表的基本操作
- 单向链表的一些操作
- LeetCode—***寻找二叉树中任意两个节点之间的最大值Binary Tree Maximum Path Sum
- poj2373 灌溉草场
- linux上编译mongodb c++ 客户端sdk
- Qt Model/View 学习笔记 (四)
- UVa10803_Thunder Mountain(最短路)(小白书图论专题)
- 单向链表的操作
- 实例学习gcc+gdb+make
- HDOJ 1171 Big Event in HDU(多重背包)
- HDU 1203 I NEED A OFFER!(01背包)
- Qt Model/View 学习笔记 (五)
- Web 服务器错误代码大全(转)
- POJ 1203 I NEED A OFFER!(01背包)
- POJ 2112 Optimal Milking (二分 + floyd + 网络流)
- 改变世界的17个等式