C数据结构学习历程(2) 链表
2015-11-04 21:44
357 查看
我是参照《严蔚敏数据结构ppt》http://wenku.baidu.com/view/3ff16fc20242a8956aece41d.html以及《严蔚敏c数据结构视频》来写的,因为ppt上有些错,而视频上的代码不全,自己另写了。ppt上错哪,我就不指出了,大家可以对照着看,就能发现不同之处。
因为有注释,我直接copy代码了。
因为有注释,我直接copy代码了。
#include<iostream> using namespace std; #define OK 1 #define ERROR -1 #define MAX_SIZE 100 typedef int Status; typedef int ElemType; typedef struct Lnode { ElemType data ; //数据 struct Lnode *next; //指针域,注意他的定义方式,需要加上struct }LNode; //头插入法创建表,链表的头结点head作为返回值 LNode *create_LinkList() { int data; LNode* head,*p; head=(LNode*)malloc(sizeof(LNode)); head->next=NULL;//创建头结点 while (1) { scanf("%d",&data); if(data==32767)break;//以32767作为结束标志 p=(LNode*)malloc(sizeof(LNode)); p->data=data;//赋值 p->next=head->next;head->next=p;//新创建的结点总是第一个结点 } return(head); } //在以L为头结点的单链表的第i个位置插入值为e的结点 void Insert_LNode(LNode*L,int i,ElemType e) { int j=0;LNode *p,*q; p=L; //因为之前测试的时候,发现在第二个位置插入时,结果跑到第3个位置 while (p!=NULL&&j<i-1) //这里应该是i-2;因为这里也是需要找到前指针,或者p=L而不是p=L->next, { p=p->next;j++; } if(j!=i-1){ printf("i太大或i为0\n");//因为p=null时,对应i太大 } else{ q=(LNode*)malloc(sizeof(LNode)); q->data=e;q->next=p->next; p->next=q; } } //删除以L为头结点的单链表中的第i个结点 1=<i<=n; //因为i=n+1,结点不存在,但前驱存在,所以循环终止条件改为p->next!=null void Delete_LinkList(LNode*L,int i) { int j=1;LNode*p,*q; p=L;q=L->next; //p是保存前驱结点 while (q!=NULL&&j<i) { p=q;q=q->next;j++; } if(j!=i)printf("i太大或i为0 \n"); else { p->next=q->next;free(q); } } ElemType Get_Elem(LNode *L,int i) { int j=1;LNode *p=L->next; while (p!=NULL&&j<i) { p=p->next; j++; } if(j!=i){ printf("i太大或为0\n");return (-32768); } else{ return (p->data); } } //返回第一个 值为e的指针结点 LNode *Locate_Node(LNode *L,ElemType e) { LNode *p=L->next; while (p!=NULL&&p->data!=e) { p=p->next; } if(p==NULL){printf("结点不存在");return (NULL);} else if(p->data==e){ //这里出错了 当p为空的时候,不能执行这一步,看来之前的都要改改 return p; } else return NULL; } LNode*Merge_LinkList(LNode*La,LNode *Lb) {//合并以La,Lb为头结点的两个有序单链表 LNode*Lc,*pa,*pb,*pc,*ptr; Lc=La;pc=La;;pa=La->next;pb=Lb->next; while (pa!=NULL&&pb!=NULL) { if(pa->data<pb->data) { pc->next=pa; pc=pa;//这点差点忘了 pc的指针也要移动 pa=pa->next; } else if(pa->data>pb->data) //当pa==NULL时,就不能指了,因此ppt又错了,应该用我刚开始出现的,if else if 结构这样就可以比较一次就循环了, //不然也可以对为NULL进行判断 { pc->next=pb; pc=pb; pb=pb->next; } else if(pa->data==pb->data) { pc->next=pa;pc=pa; pa=pa->next; ptr=pb; pb=pb->next; free(ptr);//将多出的结点合并,pb所指的结点删除 } } if(pa==NULL){ pc->next=pb; } else pc->next=pa; free(Lb); return (Lc); } int main() { LNode * ll=create_LinkList(); Insert_LNode(ll,2,19); Delete_LinkList(ll,2); LNode *p; //p=(LNode*)malloc(sizeof(LNode)); p=ll; int i=1; while (p->next!=NULL) { cout<<Get_Elem(ll,i++)<<" "; p=p->next; } /*LNode*p1= Locate_Node(ll,31); if(p1==NULL){} //这是测试Locate_Node()函数的 else cout<<"\n"<<p1->data<<endl; */ //cout<<Get_Elem(ll,2); LNode*l2=create_LinkList(); LNode*lc; lc=Merge_LinkList(ll,l2); return 0; }
相关文章推荐
- 组成最大多位数
- 2015年大二上-数据结构-链表(5)-猴子选大王
- LeetCode Kth Smallest Element in a BST(数据结构)
- redis数据结构
- 2015年大二上-数据结构-链表(4)-双链表算法库
- 结构化图形绘制利器Graphviz
- 【数据结构算法】约瑟夫环问题(线性表)
- 【数据结构】单链表的倒置
- MySQL索引背后的数据结构及算法原理--转
- 第七周 数据结构实践——停车场模拟(栈和队列综合)【项目6 - 停车场模拟】
- 数据结构与算法javascript描述(一) Node.js 运行readline
- 并发编程 — 并发数据结构--转载
- 组织数据结构的能力
- 二叉树
- 数据结构与算法
- 内存管理器(九)内核内存管理–进程相关数据结构
- 建议50:Python中的高级数据结构
- 04-树5 Root of AVL Tree
- 数据结构之栈的Java实现
- 学习数据结构与算法分析如何帮助您成为更优秀的开发人员