数据结构----线性表的应用

一.实验目的

    熟悉线性表的链式存储结构,熟练掌握线性表各种基本操作的实现,培养灵活运用线性表解决实际问题的能力。

二.实验题目

键盘输入一组元素,建立一个带头结点的单向链表(无序),遍历单向链表,在单向链表中删除元素E,然后将单向链表逆置,设计一个MAIN()函数,分别调试上述算法。

对于单向链表的建立可以有两种方式选择,一种是从头结点后面依次插入,一种是从尾结点后面依次插入,可以根据实际需要选择这两种方法之一实现。

单向链表的逆置要求不增加新的存储空间,只是在原来已有链表的基础上进行逆置,而不是构造一个新的链表,将元素逆向插入到新的链表实现逆置功能。

三.实现提示

1. 数据的存储结构选择链表,链表的每个结点的定义如下。

typedef int ElemType;
 typedef struct LNode{
 ElemType data;
 struct LNode *next;
 }LNode, *LinkList;

2. 线性链表的逆置操作可以参照下图,本图给出了一个结点逆置的过程,至少需要两个中间指针完成这个工作:


 四.思考及选做

1.如何使用顺序表实现本实验提出的要求。

2.比较顺序表和单向链表的优缺点。

3.线性链表的逆置如何能拿递归算法实现。

五.实现

#include<stdio.h>
 #include<stdlib.h>

 
 /*
 	数据结构定义
 */
 typedef int ElemType;
 typedef struct LNode
 {
 	ElemType data;
 	struct LNode *next;
 }LNode, *LinkList;
 
 /*
 	创建链表
 */
 LNode * creat(LNode *head)
 {
 	int n = 0;
 	LNode *p1, *p2;
 	p1 = p2 = (LNode *)malloc(sizeof(LNode));
 	if(p1 == NULL)
 	{
 		printf("分配存储空间失败!");
 		return 0;
 	}
 	printf("请输入整数,输入0结束:\n");
 	scanf("%d", &(p1->data));
 	while(p1->data != 0)
 	{
 		n++;
 		if(n == 1)
 		{
 			head->next = p1;
 		}
 		else
 		{
 			p2->next = p1;
 			p2 = p1;
 		}
 		
 		p1 = (LNode *)malloc(sizeof(LNode));
 		if(p1 == NULL)
 		{
 			printf("分配存储空间失败1!");
 			exit(1);
 		}
 		scanf("%d", &(p1->data));
 	}
 	p2->next = NULL;
 	return head;
 }
 
 /*
 	删除表中第i个元素
 */
 LNode * DeleteList(LNode *L,int i)
 {
 	LNode *p=L,*q;
 	ElemType e;
 	int j=0;
 	//遍历线性表L,找到第i个节点,并让p指向他的前驱
 	while(p->next&&j<i-1)
 	{
 		p=p->next;
 		++j;
 	}
 	//判断找的p的位置是否合理
 	//if(!(p->next)||j>i-1)return -1;
 	q=p->next;
 	p->next=q->next;
 	e=q->data;
 	printf("删除的是第%d个元素%d\n",i,e);
 	free(q);
 	return p;
 }
 
 /*
 	将链表反序。
 */
 LNode * reverseOrderList(LNode *head)
 {
 	LNode *p1, *p2, *p3, *p4;
 	p4 = head;
 	p1 = head->next;
 	p2 = p1->next;
 	p3 = p2->next;
 	for( ; p3 != NULL; )
 	{
 		if(p3->next == NULL)
 		{
 			p3->next = NULL;
 		}
 		p2->next = p1;
 		p1 = p2;
 		p2 = p3;
 		p3 = p3->next;
 	}
 	p2->next = p1;
 	p1 = p2;
 	p4->next->next = NULL;
 	p4->next = p1;
 	return (p4);
 }
 
 /*
 	打印输出链表
 */
 void print(LNode *d)
 {
 	LNode *p;
 	p = d->next;
 	for(;p != NULL;p = p->next)
 	{
 		printf("%d  ", p->data);
 	}
 	printf("\n");
 }
 
 /*
 	main函数
 */
 int main()
 {
 	LNode data, *head;
 	LNode *h;
 	//创建
 	head = creat(&data);
 	//删除第一个
 	DeleteList(head,0);
 	print(head);
 	//反序
 	h = reverseOrderList(head);
 	print(h);
 
 	return 0;
 }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值