数据结构(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;
}
相关推荐
Hello:CodeWorld19 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
十月的皮皮21 小时前
C语言学习笔记20260606- 求月份天数三种写法
c语言·笔记·学习
想要成为糕糕手1 天前
前端必修课:JavaScript 数组与数据结构底层逻辑全解析
javascript·数据结构·面试
caimouse1 天前
Reactos 第 5 章 进程与线程 — 5.8 Windows 的 APC 机制
c语言·windows
tyung1 天前
Go 手写 Wait-Free SPSC 无界队列:无 CAS、无锁、泛型节点池
数据结构·后端·go
努力攻坚操作系统1 天前
编程语言编译运行机制对比:C / Java / Python
java·c语言·python
Chen_harmony1 天前
一、数据结构概念和复杂度计算
数据结构
小欣加油1 天前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
学会去珍惜1 天前
C语言简介
c语言·开发语言
凡人叶枫1 天前
Effective C++ 条款07:为多态基类声明 virtual 析构函数
linux·c语言·开发语言·c++