顺序表和单链表的就地逆置(源代码)
时间:2025-07-11
时间:2025-07-11
数据结构之C语言小练习,算法简单易懂
数据结构之顺序表和链表的就地逆置源代码
//顺序表和链表的就地逆置
#include<stdio.h>
#include<malloc.h>
#define maxsize 100
struct data //为链表的处理做结构体定义
{
int m;
data *next;
}; //子函数,每种数据结构两个函数,前者是顺序表,后者是链表 void display1(int a[],int num);
void inverse1(int a[],int num);
void display2(data *b,int num);
void inverse2(data *b,int num);
void main()
{
int i,num1,num2;
int a[maxsize];
data *b,*p,*q;
//顺序表的就地逆置
printf("请输入需要创建的顺序表的长度:\n");
scanf("%d",&num1);
printf("请输入顺序表的关键字:\n");
for(i=0;i<num1;i++)
{
fflush(stdin); //清除输入缓存
scanf("%d",&a[i]);
}
printf("创建的顺序表为:\n");
display1(a,num1);
inverse1(a,num1); //地址传递
printf("\n就地逆置后的顺序表:\n");
display1(a,num1);
//链表的就地逆置
printf(" \n请输入需要创建的链表的长度:\n");
scanf("%d",&num2);
printf("请输入链表的关键字:\n");
b=(data*)malloc(sizeof(data)); //申请内存空间
b->next=NULL; //链表含有头结点
q=b;
for(i=0;i<num2;i++)
{
p=(data*)malloc(sizeof(data));
数据结构之C语言小练习,算法简单易懂
fflush(stdin);
scanf("%d",&p->m);
p->next=q->next;
q->next=p;
q=q->next;
}
printf("创建的链表为:\n");
display2(b,num2);
inverse2(b,num2); //地址传递
printf("\n就地逆置后的链表:\n");
display2(b,num2);
}
void display1(int a[],int num)
{
int i;
for(i=0;i<num;i++)
{
printf("-%d-",a[i]);
}
}
void inverse1(int a[],int num)
{
int *p,*q,t;
p=&a[0]; //指向第一个数
q=&a[num-1]; //指向最后一个数
while(p<q) //算法是:前后指针所指的数值交换,然后向中间靠拢,直到p<q停止 {
t=*p;
*p=*q;
*q=t;
p++;
q--;
}
}
void display2(data *b,int num)
{
data *t;
t=b->next;
while(t!=NULL)
{
printf("-%d-",t->m);
t=t->next;
}
}
数据结构之C语言小练习,算法简单易懂
void inverse2(data *b,int num) {
data *p,*q;
int i,j,t;
for(i=1;i<=num-1;i++) {
p=b->next;
q=p->next;
for(j=num-i;j>0;j--) //算法类似于冒泡排序 {
}
}
}
t=p->m; p->m=q->m; q->m=t; p=p->next; q=q->next;