链表
来源:互联网 发布:linux防篡改 编辑:程序博客网 时间:2024/06/15 10:30
#include<iostream>#include<malloc.h>typedef char ElemType;typedef int Status;#define OK 1#define ERROR 0using namespace std;typedef struct LNode{ ElemType data; LNode *next;} LNode, *LinkList;void about() //版本信息{ cout << "单链表的操作"<<endl;}void showmenu() //功能列表{ cout << endl << " **********功能**********" << endl << " * 1.输出单链表的全部数据*" << endl << " * 2.查找链表元素 *" << endl << " * 3.链表插入元素 *" << endl << " * 4.链表删除元素 *" << endl << " * 5.结束 *" << endl << " ************************" << endl << "请输入所需功能: ";}//*******查看输入的全部数据*********void PrintList(LinkList L){ LinkList p; cout << endl << "你输入的数据为: "; p = L->next; //从头结点开始扫描 while(p) //顺指针向后扫描,直到p->next为NULL或i=j为止 { cout << p->data; cout<<" "; p = p->next; } cout << endl;}//逆序输入 n 个数据元素,建立带头结点的单链表void CreateList_L(LinkList &L, int n){ int i; LinkList p; L = new LNode; L->next = NULL; // 先建立一个带头结点的单链表 cout << "逆序输入 n 个数据元素,建立带头结点的单链表" << endl; for(i = n; i > 0; --i) { p = new LNode; cin >> p->data; // 输入元素值 p->next = L->next; L->next = p; // 插入 }}// L是带头结点的链表的头指针,以 e 返回第 i 个元素Status GetElem_L(LinkList L, int i, ElemType &e){ int j; LinkList p; p = L->next; j = 1; // p指向第一个结点,j为计数器 while(p && j < i) { p = p->next; // 顺指针向后查找,直到 p 指向第 i 个元素或 p 为空 ++j; } if(!p || j > i) return ERROR; // 第 i 个元素不存在 e = p->data; // 取得第 i 个元素 return OK;}// 本算法在链表中第i 个结点之前插入新的元素 eStatus ListInsert_L(LinkList L, int i, ElemType e){ int j; LinkList p, s; p = L; j = 0; while(p && j < i - 1) { p = p->next; // 寻找第 i-1 个结点 ++j; } if(!p || j > i - 1) return ERROR; // i 大于表长或者小于1 s = new LNode; // 生成新结点 if(s == NULL) return ERROR; s->data = e; s->next = p->next; p->next = s; // 插入 return OK;}Status ListDelete_L(LinkList L, int i, ElemType &e){ LinkList p, q; int j; p = L; j = 0; while(p->next && j < i - 1) { p = p->next; ++j; }// 寻找第 i 个结点,并令 p 指向其前趋 if(!(p->next) || j > i - 1) return ERROR; // 删除位置不合理 q = p->next; p->next = q->next; // 删除并释放结点 e = q->data; free(q); return OK;}int main(){ LinkList L; int n, choice, i; ElemType e; about(); cout << "请输入链表中元素的个数"; cin >> n; CreateList_L(L, n); showmenu(); //功能列表 cin >> choice; while(choice != 5) { //输入时候退出程序 switch(choice) { case 1: PrintList(L); break; //1.查看输入的全部数据 case 2: { cout << "输入你要查找的元素的位置: "; cin >> i; GetElem_L(L, i, e); cout << "第" << i << "个元素的值是" << e << endl; break; } //2.查找链表元素 case 3: { cout << "请输入你要插入元素的位置i: "; cin >> i; cout << endl << "请输入你要插入元素的值: "; cin >> e; ListInsert_L(L, i, e); break; } //3.链表插入元素 case 4: { cout << "请输入你要删除元素的位置"; cin >> i; ListDelete_L(L, i, e) ; break; } //4.链表删除元素 default: cout << "输入错误,请输入-5,输入重显示功能表^_^ " << endl; } cout << endl << "输入功能序号:"; cin >> choice; }}#include<stdio.h>#include<stdlib.h>typedef int DataType;typedef struct Node{ DataType data; struct Node *next;} SLNode;void ListInitiate(SLNode * * L){ if((*L=(SLNode *)malloc(sizeof(SLNode)))==NULL)exit(1); (*L)->next=NULL;}int ListLength(SLNode *L){ SLNode *p=L; int size=0; while(p->next!=L) { p=p->next; size++; } return size;}int ListInsert(SLNode *L,int i,DataType x){ SLNode *p,*q; int j; p=L; j=0; while(p->next!=NULL&&j<i-1) { p=p->next; j++; } if(j!=i-1) { printf("error"); return 0; } if((q=(SLNode *)malloc(sizeof(SLNode)))==NULL)exit(1); q->data=x; q->next=p->next; p->next=q; return 0;}int ListDelete(SLNode *L,int i,DataType *x){ SLNode *p,*s; int j; p=L; j=0; while(p->next!=NULL&&j<i-1) { p=p->next; j++; } if(j!=i-1) { printf("error"); return 0; } s=p->next; *x=s->data; p->next=s->next; free(s); return 0;}int ListSearch(SLNode *L,DataType x){ SLNode *p; int j; p=L; j=1; while(p->next!=NULL) { p=p->next; if(p->data==x) { printf("找到,%d在第%d个位置",x,j); return 0; } j++; } printf("没有找到%d",x); return 0;}//逆置void ListReverse(SLNode *L){ SLNode *p,*q,*s; p=L->next; q=p->next; s=NULL; while(q!=NULL) { s=q->next; q->next=p; p=q; q=s; } L->next->next=NULL; L->next=p;}//合并void ListMerger(SLNode *La,SLNode *Lb,SLNode *Lc){ SLNode *pa,*pb,*pc; pa=La->next; pb=Lb->next; Lc=pc=La; while(pa&&pb) { if(pa->data<=pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } pc->next=pa?pa:pb; free(Lb);}void Destroy(SLNode * *L){ SLNode *p,*p1; p=*L; while(p!=NULL) { p1=p; p=p->next; free(p1); } *L=NULL;}int main(void){ SLNode *La,*Lb,*Lc,*p; int n,m; int i,x; ListInitiate(&La); p=La; printf("请输入线性表La长度:"); scanf("%d",&n); printf("请输入线性表La中的元素:"); for(i=1; i<=n; i++) { scanf("%d",&x); ListInsert(La,i,x); } printf("请输入要插入到线性表La中的数字x和要插入的位置:"); scanf("%d%d",&x,&i); ListInsert(La,i,x); printf("线性表La="); while(p->next!=NULL) { p=p->next; printf("%d ",p->data); } printf("\n请输入要删除的数字的位置:"); scanf("%d",&i); ListDelete(La,i,&x); p=La; printf("线性表La="); while(p->next!=NULL) { p=p->next; printf("%d ",p->data); } printf("\n请输入要查找的数字:"); scanf("%d",&x); ListSearch(La,x); ListReverse(La); p=La; printf("\n逆置线性表La="); while(p->next!=NULL) { p=p->next; printf("%d ",p->data); } ListInitiate(&Lb); p=La; printf("\n请输入线性表Lb长度:"); scanf("%d",&m); printf("请输入线性表Lb中的元素:"); for(i=1; i<=m; i++) { scanf("%d",&x); ListInsert(Lb,i,x); } ListInitiate(&Lc); ListMerger(La,Lb,Lc); p=La; printf("合并La和Lb后的线性表为:"); while(p->next!=NULL) { p=p->next; printf("%d ",p->data); } Destroy(&La); // Destroy(&Lb); Destroy(&Lc); return 0;}#include <stdio.h>#include <stdlib.h>typedef int ElemType;//////////////////////////////////////////////定义结点类型typedef struct Node{ ElemType data; //单链表中的数据域 struct Node *next; //单链表的指针域}Node,*LinkedList;//////////////////////////////////////////////单链表的初始化LinkedList LinkedListInit(){ Node *L; L = (Node *)malloc(sizeof(Node)); //申请结点空间 if(L == NULL) //判断是否有足够的内存空间 printf("申请内存空间失败/n"); L->next = NULL; //将next设置为NULL,初始长度为0的单链表}//////////////////////////////////////////////单链表的建立1,头插法建立单链表LinkedList LinkedListCreatH(){ Node *L; L = (Node *)malloc(sizeof(Node)); //申请头结点空间 L->next = NULL; //初始化一个空链表 ElemType x; //x为链表数据域中的数据 while(scanf("%d",&x) != EOF) { Node *p; p = (Node *)malloc(sizeof(Node)); //申请新的结点 p->data = x; //结点数据域赋值 p->next = L->next; //将结点插入到表头L-->|2|-->|1|-->NULL L->next = p; } return L;}//////////////////////////////////////////////单链表的建立2,尾插法建立单链表LinkedList LinkedListCreatT(){ Node *L; L = (Node *)malloc(sizeof(Node)); //申请头结点空间 L->next = NULL; //初始化一个空链表 Node *r; r = L; //r始终指向终端结点,开始时指向头结点 ElemType x; //x为链表数据域中的数据 while(scanf("%d",&x) != EOF) { Node *p; p = (Node *)malloc(sizeof(Node)); //申请新的结点 p->data = x; //结点数据域赋值 r->next = p; //将结点插入到表头L-->|1|-->|2|-->NULL r = p; } r->next = NULL; return L;}//////////////////////////////////////////////单链表的插入,在链表的第i个位置插入x的元素LinkedList LinkedListInsert(LinkedList L,int i,ElemType x){ Node *pre; //pre为前驱结点 pre = L; int tempi = 0; for (tempi = 1; tempi < i; tempi++) pre = pre->next; //查找第i个位置的前驱结点 Node *p; //插入的结点为p p = (Node *)malloc(sizeof(Node)); p->data = x; p->next = pre->next; pre->next = p; return L;}//////////////////////////////////////////////单链表的删除,在链表中删除值为x的元素LinkedList LinkedListDelete(LinkedList L,ElemType x){ Node *p,*pre; //pre为前驱结点,p为查找的结点。 p = L->next; while(p->data != x) //查找值为x的元素 { pre = p; p = p->next; } pre->next = p->next; //删除操作,将其前驱next指向其后继。 free(p); return L;}/////////////////////////////////////////////int main(){ LinkedList list,start;/* printf("请输入单链表的数据:"); list = LinkedListCreatH(); for(start = list->next; start != NULL; start = start->next) printf("%d ",start->data); printf("/n");*/ printf("请输入单链表的数据:"); list = LinkedListCreatT(); for(start = list->next; start != NULL; start = start->next) printf("%d ",start->data); printf("/n"); int i; ElemType x; printf("请输入插入数据的位置:"); scanf("%d",&i); printf("请输入插入数据的值:"); scanf("%d",&x); LinkedListInsert(list,i,x); for(start = list->next; start != NULL; start = start->next) printf("%d ",start->data); printf("/n"); printf("请输入要删除的元素的值:"); scanf("%d",&x); LinkedListDelete(list,x); for(start = list->next; start != NULL; start = start->next) printf("%d ",start->data); printf("/n"); return 0;}
0 0
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- 链表
- GPIO内核之旅
- css: position 与 z-index 问题(2)
- iOS沙盒与Bundle详解及文件操作
- Apple Pay准备工作-申请MerchantID及对应证书详细图文教程
- mac下opengl自学入门第一篇
- 链表
- java体系结构及内存模型
- HTTP视频知识填充
- oracle 常用函数,不全后期补上。
- 如何开发及维护一个可运营性很高的电商系统
- 微信内支付 微信jsapi之前台js部分
- MyEclipse 10.0,9.0,8.0 下添加jadClipse反编译插件
- CPU使用率
- github生成SSH公钥