数据结构(6)

实验步骤:

任务一:

编写算法实现带头结点单链表的就地逆置,即利用原带头结点单链表的结点空间把元素序列 a0,al,......,an-i 逆置为 an-1,......,al, a0

程序参数设计 定义了一个带头结点的单链表结构体,并提供了初始化、尾部插入、打印、就地逆置和释放链表的函数。在主函数中,首先初始化链表,然后添加一些元素,打印原始链表,执行就地逆置,最后打印逆置后的链表并释放链表的空间。

代码如下:

cpp 复制代码
#include<stdio.h>
#include<malloc.h>
typedef int DataType;
#include "LinList.h"
int main(void){
	SLNode*head,*p,*q,*temp;
	int i,j,x;
	ListInitiate(&head);
	for(i=0;i<10;i++)
		ListInsert(head,i,i+1);
	printf("原来链表:"); 
	for(i=0;i<ListLength(head);i++){
		ListGet(head,i,&x);
		printf("%d  ",x);
	}
	printf("\n");
	for(i=1;i<=ListLength(head)-1;i++){
		temp=head;
		p=head->next;
		q=p->next;
		for(j=1;j<=ListLength(head)-i&&q!=NULL;j++){
			temp->next=q;
			temp=q;
			p->next=q->next;
			q->next=p;
			q=p->next;
		}
	}		
	printf("当前链表:");
	for(i=0;i<ListLength(head);i++){
		ListGet(head,i,&x);
		printf("%d  ",x);
	}
	Destroy(&head);
}
头文件:

typedef struct Node{
	DataType data;
	struct Node *next;
}SLNode;
void ListInitiate(SLNode**head){
	*head=(SLNode *)malloc(sizeof(SLNode));
	(*head)->next=NULL;
}
int ListLength(SLNode *head){
	SLNode *p=head;
	int size=0;
	while(p->next!=NULL){
		p=p->next;
		size++;
	}
	return size;
}
int ListInsert(SLNode *head,int i,DataType x){
	SLNode *p,*q;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	if(j!=i-1){
		printf("插入元素位置参数错!");
		return 0;
	}
	q=(SLNode *)malloc(sizeof(SLNode));
	q->data=x;
	q->next=p->next;
	p->next=q;
	return 1;
}
int ListDelete(SLNode *head,int i,DataType *x){
	SLNode *p,*s;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL&&p->next->next!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	if(j!=i-1){
		printf("删除元素位置参数错!");
		return 0;
	}
	s=p->next;
	*x=s->data;
	p->next=p->next->next;
	free(s);
	return 1;
}
int ListGet(SLNode *head,int i,DataType *x){
	SLNode *p;
	int j;
	p=head;
	j=-1;
	while(p->next!=NULL&&j<i){
		p=p->next;
		j++;
	}
	if(j!=i){
		printf("取出元素位置参数错!");
		return 0;
	}
	*x=p->data;
	return 1;
}
void Destroy(SLNode **head){
	SLNode *p,*p1;
	p=*head;
	while(p!=NULL){
		p1=p;
		p=p->next;
		free(p1);
	}
	*head=NULL;
}

任务二:

设计循环单链表。要求:

(1)循环单链表的操作,包括初始化,求元素个数,插入、删除、取元素。

(2) 设计一个测试主函数验证所设计循环单链表的正确性。

程序参数分析 定义 Node 结构体来表示循环单链表的结点,头结点的 next 指针指向链表的首结点,而最后一个结点的 next 指针指向头结点,形成循环。程序提供了初始化、求元素个数、插入、删除、取元素、打印、释放链表空间等函数。在主函数中,我们演示了插入、删除、获取元素、打印链表长度和释放链表的操作。

代码如下:

cpp 复制代码
#include<stdio.h>   
#include<malloc.h>
typedef int DataType;
#include"LinListO.h"
int main(void){
    SLNode *head,*p;
    int i,x;
    ListInitiate(&head);
    for(i=0;i<10;i++){
        ListInsert(head,i,i+1);
    }
   	//ListDelete(head,4,&x);
   	printf("链表中的元素:");
    for(i=0;i<ListLength(head);i++){
        ListGet(head,i,&x);
        printf("%d   ",x);
    }
    //printf("\n%d ",head->next->data);
    //printf("\n%d ",head->next->next->next->next->next->next->data);
    int j=-1;
    p=head;
    while(p->next!=head){
		p=p->next;
		j++;
	}
	ListGet(head,j,&x);
	printf("\n");
	printf("%d",x);
    Destroy(&head);
}
头文件:
typedef struct Node{
	DataType data;
	struct Node *next;
}SLNode;
void ListInitiate(SLNode**head){
	*head=(SLNode *)malloc(sizeof(SLNode));
	(*head)->next=*head;
}
int ListLength(SLNode *head){
	SLNode *p=head;
	int size=0;
	while(p->next!=head){
		p=p->next;
		size++;
	}
	return size;
}
int ListInsert(SLNode *head,int i,DataType x){
	SLNode *p,*q;
	int j;
	p=head;
	j=-1;
	while(p->next!=head&&j<i-1){
		p=p->next;
		j++;
	}
	if(j!=i-1){
		printf("插入元素位置参数错!");
		return 0;
	}
	q=(SLNode *)malloc(sizeof(SLNode));
	q->data=x;
	q->next=p->next;
	p->next=q;
	return 1;
}
int ListDelete(SLNode *head,int i,DataType *x){
	SLNode *p,*s;
	int j;
	p=head;
	j=-1;
	while(p->next!=head&&p->next->next!=head&&j<i-1){
		p=p->next;
		j++;
	}
	if(j!=i-1){
		printf("删除元素位置参数错!");
		return 0;
	}
	s=p->next;
	*x=s->data;
	p->next=p->next->next;
	free(s);
	return 1;
}
int ListGet(SLNode *head,int i,DataType *x){
	SLNode *p;
	int j;
	p=head;
	j=-1;
	while(p->next!=head&&j<i){
		p=p->next;
		j++;
	}
	if(j!=i){
		printf("取出元素位置参数错!");
		return 0;
	}
	*x=p->data;
	return 1;
}
void Destroy(SLNode **head){
	SLNode *p,*p1;
	p=*head;
	while(p!=NULL){
		p1=p;
		p=p->next;
		free(p1);
	}
	*head=NULL;
}
相关推荐
疯狂打码的少年1 小时前
【数据结构】队列的应用:循环队列
数据结构·笔记·算法
MC皮蛋侠客1 小时前
TDengine C++ 系列(5):C/C++ 连接器——连接管理与查询 API
c语言·c++·tdengine
天空'之城2 小时前
C 语言工业级通用组件手写 27:配置参数管理组件
c语言·eeprom·参数管理·工业级组件·掉电存储
YSL0701242 小时前
指针习题讲解
c语言
wuyk55510 小时前
第2章:六步换相原理全解+STM32工程实战
c语言·开发语言·stm32·单片机·嵌入式硬件
Doraemomo10 小时前
数据结构-环形链表
java·数据结构·链表
爱跳舞的烤冷面14 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
C++ 老炮儿的技术栈16 小时前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
MC皮蛋侠客16 小时前
Redis 系列(一):全景与最小闭环——从 `SET` 命令到内存数据结构
数据结构·数据库·redis
疯狂打码的少年16 小时前
【数据结构】队列:定义、顺序队列与链式队列
数据结构·笔记