数据结构实验一:链表的建立与操作

实验目的

掌握链表数据结构的建立及操作

实验内容

设计一个将输入数据建立成链表、并依次输出链表数据、利用原空间把链表反转的程序。

实验步骤

1.​定义数据元素类型,链表结点及链表结构体

2.完成链表创建、销毁、插入、删除结点、获取结点值、遍历链表、反转结点函数

3.可以分步写代码和调试运行,如:主函数;创建、销毁;插入、删除结点;遍历链表;反转结点

4.进行部分反转,判断是不是链表回文

注:链表是否使用头结点,任选。

设计思路

本实验完成了创建链表,释放链表,遍历链表,增加结点,删除结点,获取结点值,复制链表,反转链表,判断链表回文等功能;创建链表是通过尾插法实现的,反转链表是利用原空间通过头插实现的,判断回文是先复制未反转过的链表,再把它和反转过的链表相比较,如果是一样的,则是回文。

运行代码

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

//创建结构体
typedef struct LNode
{
	int data;
	LNode* next;
}LNode, * LinkList;
//创建链表
void create_list(LinkList& L, int n) { 
	int i;
	LNode* p, * r;
	L = (LinkList)malloc(sizeof(LNode));
	
	L->next = NULL;
	r = L;
	printf("input list_elem:");
	for (i = n; i > 0; --i) {//尾插法
		p = (LinkList)malloc(sizeof(LNode));
		scanf_s("%d", &(p->data));
		r->next = p;
		r = p;
		//p->next = L->next;
		//L->next = p;
	}
	r->next = NULL;
}

//释放链表 
void free_list(LinkList& L) {
	if (NULL == L) {
		return;
	}
	LNode* p = L;
	while (p = p->next) {
		L->next = p->next;
		free(p);
		p = L;
	}
	free(L);
}

//遍历链表 
void display_list(LinkList& L) {
	LNode* p;
	p = L;
	while (p->next != NULL) {
		printf("%d ", p->next->data);
		p = p->next;
	}
	p->next = NULL;
	printf("\n\n");

}

//反转链表
void invert_list(LinkList& L) {
	if (NULL == L) {
		return;
	}
	
	LNode* p = L->next;
	LNode* q = p->next;
	LNode* t = NULL;
	p->next = NULL;
	while (q != NULL) {
		t = q->next;
		q->next = p;
		p = q;
		q = t;
	}
	L->next = p;
}

//获取结点值
int getelem_list(LinkList& L, int i) {
	LNode* p = L->next;
	int j = 1;
	while (p && j < i) {
		p = p->next;
		++j;
	}
	if (!p || j > i)return -1;
	return p->data;
}

//在第i个结点插入e
void insert_list(LinkList& L, int i, int e) {
	LNode* p = L;
	int j = 0;
	while (p && j < i - 1) {
		p = p->next;
		++j;
	}
	if (!p || j > i - 1)return;
	LinkList s;
	s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;


}

//删除第i个结点
void delete_list(LinkList& L, int i) {
	LNode* p = L;
	int j = 0;
	while (p->next && j < i - 1) {
		p = p->next;
		++j;
	}
	if (!p->next || j > i - 1)return;
	LNode* q = p->next;
	p->next = q->next;
	free(q);
}

//判断是否回文
void palindrome_list(LinkList& L, LinkList& an_L) {
	int j = 1;
	LNode* p = L->next, * q = an_L->next;
	while (p != NULL && q != NULL )
	{
		if (p->data == q->data) { p = p->next; q = q->next; }
		else { j = 0; break; }
	}
	if (j == 0)printf("NO!\n\n");
	else printf("YES!\n\n");
	}
//复制链表
void copy_list(LinkList& L, LinkList& an_L,int n) {
	int i;
	LNode* p, * r,*x;
	x = L->next;
	r = an_L;
	for (i = n; i > 0; --i) {//尾插法
		p = (LinkList)malloc(sizeof(LNode));
		p->data = x->data;
		x = x->next;
		r->next = p;
		r = p;
		//p->next = L->next;
		//L->next = p;
	}
	r->next = NULL;

}

int main() {
	LinkList L, an_L;
	L = (LinkList)malloc(sizeof(LNode));
	an_L = (LinkList)malloc(sizeof(LNode));
	
	int n, de, in1, in2, get;
	printf("input length:");//链表长度 
	scanf_s("%d", &n);

	create_list(L, n);//创建链表 
	printf("1.create list:");
	display_list(L);

	printf("2.choose a position and a number to insert:");//插入结点
	scanf_s("%d %d", &in1, &in2);
	insert_list(L, in1, in2);
	display_list(L);

	printf("3.choose a position to delete:");//删除结点
	scanf_s("%d", &de);
	delete_list(L, de);
	display_list(L);

	printf("4.input a position to get its elem:");//获取结点值
	scanf_s("%d", &get);
	printf("its elem is:%d\n\n", getelem_list(L, get));


	copy_list(L, an_L, n);//复制未反转的链表

	printf("5.inverted list:");// 反转链表 
	invert_list(L);
	 display_list(L);//输出反转后的链表

	printf("6.is palindrome?  ");//判断回文
	palindrome_list(L, an_L);
	

	free_list(L);//释放链表
	free_list(an_L);
	return 0;
}

运行结果及分析

实验结果符合预期,完成了想要的各项功能。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,我来回复。7-1 数据结构实验链表一:顺序建立链表是一道链表实验题目,要求学生使用顺序存储的方式建立链表,并实现链表的基本操作,如插入、删除、查找等。这道题目可以帮助学生深入理解链表的原理和实现方式,提高其对数据结构的理解和应用能力。 ### 回答2: 链表是一种常见的数据结构,它是由一系列结点组成的线性结构。结点包括两部分内容,一部分是存储数据的元素,另一部分是指向下一个结点的指针。链表的优点在于可以动态地增加、删除结点,因此它常用于需要频繁增删数据的场合。 本次实验是链表的第一部分,即顺序建立链表。顺序建立链表指的是从头到尾依次输入结点,将其链接在一起形成链表。具体实现方法如下: 1. 定义一个结点结构体,包含存储数据的元素和指向下一个结点的指针。 2. 在主函数中定义一个头结点,头结点的数据元素可以不存储有效数据,仅用于方便遍历链表。 3. 通过循环输入数据,并将数据存储在新结点中。 4. 将新结点的指针指向头结点指向的下一个结点,再将头结点的指针指向新结点,即完成了新结点的插入。 5. 继续输入下一个数据,直到输入完毕。 6. 最后遍历链表输出所有数据。 顺序建立链表的算法简单易懂,适合初学者入门。但是该算法的缺点在于它需要依次遍历链表,时间复杂度较高,因此在数据量较大时效率会比较低。此外,该算法只能按照输入的顺序依次插入数据,不能根据数据的大小或其他规则来插入新结点,因此在一些需要按照某种规则排序的场合可能无法满足需求。 总之,顺序建立链表链表的一种基本实现方法,掌握该算法对于学习其他链表操作是非常有帮助的。 ### 回答3: 链表数据结构中很重要的一种,它可以实现灵活的插入、删除、查找等操作。其中,顺序建立链表链表的一种常见方法。 顺序建立链表的过程中,我们需要先定义一个节点结构体,例如: typedef struct node{ int data; // 数据域 struct node* next; // 指针域 }Node; 在这个结构体中,有一个数据域用来存储节点的值,还有一个指针域用来指向下一个节点。接下来,我们可以通过输入数据来构建链表。 具体实现方法是,先定义一个头指针,然后通过循环读取输入的数据,并将其插入到链表中。例如,以下是一个简单的顺序建立链表的代码: void CreateList(Node *&head){ int data; Node *p, *q; head = NULL; q = head; cin >> data; while(data != -1){ p = new Node; p->data = data; p->next = NULL; if(head == NULL){ head = p; q = head; } else{ q->next = p; q = p; } cin >> data; } } 这段代码中,首先定义一个头指针head,将其初始化为NULL。然后依次读取输入的数据,直到读取到-1为止。在每次读取数据之后,新建一个节点p,并将输入的数据存储在节点的数据域中,然后将p插入到链表的尾部。 顺序建立链表的优点是简单快捷,代码实现比较容易,适用于已经知道链表数据的顺序的情况。但是其缺点是无法处理插入数据的顺序不确定的情况,因此需要使用其他方法进行插入操作,例如头插法或尾插法。 综上所述,链表是一个十分重要的数据结构,顺序建立链表链表的一个常用构建方法,其优点是简单快捷,但对于插入顺序不确定的数据,需要使用其他方法进行插入操作

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值