数据结构(6)

实验步骤:

任务一:

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

程序参数设计\] 定义了一个带头结点的单链表结构体,并提供了初始化、尾部插入、打印、就地逆置和释放链表的函数。在主函数中,首先初始化链表,然后添加一些元素,打印原始链表,执行就地逆置,最后打印逆置后的链表并释放链表的空间。 代码如下: ```cpp #include #include 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;inext; 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;inext=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&&jnext; 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&&jnext; 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&&jnext; 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 #include 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;inext->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&&jnext; 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&&jnext; 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&&jnext; 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 小时前
【数据结构初阶】单链表
c语言·开发语言·数据结构·c++·经验分享·笔记·链表
闪电麦坤956 小时前
数据结构:递归的种类(Types of Recursion)
数据结构·算法
小熊猫写算法er7 小时前
终极数据结构详解:从理论到实践
数据结构
-qOVOp-7 小时前
408第一季 - 数据结构 - 栈与队列的应用
数据结构
鑫鑫向栄8 小时前
[蓝桥杯]修改数组
数据结构·c++·算法·蓝桥杯·动态规划
鑫鑫向栄8 小时前
[蓝桥杯]带分数
数据结构·c++·算法·职场和发展·蓝桥杯
sss191s9 小时前
Java 集合面试题从数据结构到 HashMap 源码剖析详解及常见考点梳理
java·开发语言·数据结构
hjyowl9 小时前
题解:AT_abc407_c [ABC407C] Security 2
c语言·开发语言·算法
old_power11 小时前
UCRT 和 MSVC 的区别(Windows 平台上 C/C++ 开发相关)
c语言·c++·windows
鑫鑫向栄11 小时前
[蓝桥杯]堆的计数
数据结构·c++·算法·蓝桥杯·动态规划