欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

数据结构线性表的单链表实现c/c++语言

时间:2023-04-27
文章目录

1.建立链表

1.1头插法1.2尾插法 2.结点插入3.结点删除

3.1通过结点位置3.2通过结点数值(数值一样全删) 4、查找 和 更改

4.1 查找4.2 插入 5、合并有序单链表(两个升序)6.合体总代码! 1.建立链表 1.1头插法

linkList List_HeadInsert(){//生成头结点 linkList L = (linkList)malloc(sizeof(LNode));L->next=NULL;int n;printf("请输入要生成链表的长度n"); cin>>n;cout<<"倒序输入数据"<>s->data;s->next = L->next;L->next = s; }return L;}

1.2尾插法

linkList List_TailInsert(){linkList L = (linkList)malloc(sizeof(LNode));L->next = NULL;LNode * r=L; //尾指针 int n;cout<<"请输入要生成的链表的长度"<>n;cout<<"正序输入数据"<>s->data;s->next = NULL;r->next = s;r = r->next; }return L;}

2.结点插入

Status ListInsert_L(linkList &L, int i, ElemType e){LNode * p = L; int j=0; //尝试找位置 while(p && jnext;j++;}if(p && j链表长度都会进入判断linkList s = (linkList)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s; return true;}

3.结点删除 3.1通过结点位置

Status ListDelete_L(linkList & L, int i, ElemType &e){LNode * p = L;int j=0 ;while( p->next && jnext;j++;} if(p->next && jnext;e = q->data;p->next = p->next->next;free(q);return true;}

3.2通过结点数值(数值一样全删)

Status ListDelete_L2(linkList & L, ElemType e){LNode *p = L;bool flag=false; while(p->next){if(p->next->data == e){LNode *q = p->next;p->next = p->next->next; free(q);flag = true;}else{//如果删除了一次,不能向后移动指针 p = p->next;}}return flag;}

4、查找 和 更改 4.1 查找

Status ListFind_L(linkList & L, int i ,ElemType &e){LNode *p = L;int j=0;while(p && j<=i-1){//此处与插入处不同 p = p->next;j++;}if(p && jdata;return true;}

4.2 插入

Status ListChange_L(linkList & L, int i ,ElemType &e){LNode *p = L;int j=0;while(p && j<=i-1){//此处与插入处不同 p = p->next;j++;}if(p && jdata = e ;//此处和查找相反return true;}

5、合并有序单链表(两个升序)

void MergeList_L(linkList &La, linkList & Lb, linkList & Lc){linkList pa = La->next;linkList pb = Lb->next;linkList pc;Lc = La;pc = Lc;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;}}//其中一个链表结束了,剩下的那个拼起来就是结果 while(pa){pc ->next = pa;pc = pa;pa = pa->next;}while(pb){pc ->next = pb;pc = pb;pb = pb->next;}free(Lb);}

6.合体总代码!

#include #include using namespace std;#define ElemType int #define Status booltypedef struct LNode{ElemType data;struct LNode * next;} LNode, * linkList;//打印单链表Status Printf_List(linkList L){cout<<"打印数据-----------------"<next;while(L!=NULL){cout<data<<" ";L = L->next;}cout<next=NULL;int n;printf("请输入要生成链表的长度n"); cin>>n;cout<<"倒序输入数据"<>s->data;s->next = L->next;L->next = s; }return L;} //尾插法linkList List_TailInsert(){linkList L = (linkList)malloc(sizeof(LNode));L->next = NULL;LNode * r=L; //尾指针 int n;cout<<"请输入要生成的链表的长度"<>n;cout<<"正序输入数据"<>s->data;s->next = NULL;r->next = s;r = r->next; }return L;}//结点插入Status ListInsert_L(linkList &L, int i, ElemType e){LNode * p = L; int j=0; //尝试找位置 while(p && jnext;j++;}if(p && j链表长度都会进入判断linkList s = (linkList)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s; return true;} //结点删除通过结点位置 Status ListDelete_L(linkList & L, int i, ElemType &e){LNode * p = L;int j=0 ;while( p->next && jnext;j++;} if(p->next && jnext;e = q->data;p->next = p->next->next;free(q);return true;}//结点删除 通过结点数值,数值一样全部删除 Status ListDelete_L2(linkList & L, ElemType e){LNode *p = L;bool flag=false; while(p->next){if(p->next->data == e){LNode *q = p->next;p->next = p->next->next; free(q);flag = true;}else{//如果删除了一次,不能向后移动指针 p = p->next;}}return flag;} //查找 根据下标找数据 Status ListFind_L(linkList & L, int i ,ElemType &e){LNode *p = L;int j=0;while(p && j<=i-1){//此处与插入处不同 p = p->next;j++;}if(p && jdata;return true;} // 更改 和 查找 及其相似 Status ListChange_L(linkList & L, int i ,ElemType &e){LNode *p = L;int j=0;while(p && j<=i-1){//此处与插入处不同 p = p->next;j++;}if(p && jdata = e ;return true;} // 两个有序的链表合并成一个有序的链表, 序列为非递减 void MergeList_L(linkList &La, linkList & Lb, linkList & Lc){linkList pa = La->next;linkList pb = Lb->next;linkList pc;Lc = La;pc = Lc;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;}}//其中一个个链表结束了,剩下的那个拼起来就是结果 while(pa){pc ->next = pa;pc = pa;pa = pa->next;}while(pb){pc ->next = pb;pc = pb;pb = pb->next;}free(Lb);} int main(int argc, char** argv) {//linkList a = List_TailInsert();//linkList b = List_TailInsert();//Printf_List(a);//Printf_List(b);//linkList c;//MergeList_L(a, b, c);//Printf_List(c);return 0;}

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。