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

我是参照《严蔚敏数据结构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;
}











  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值