您的位置:首页 > 理论基础 > 数据结构算法

C数据结构学习历程(2) 链表

2015-11-04 21:44 357 查看
我是参照《严蔚敏数据结构ppt》http://wenku.baidu.com/view/3ff16fc20242a8956aece41d.html以及《严蔚敏c数据结构视频》来写的,因为ppt上有些错,而视频上的代码不全,自己另写了。ppt上错哪,我就不指出了,大家可以对照着看,就能发现不同之处。

因为有注释,我直接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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: