顺序表逆置
两两交换分别是首尾交换一次和中间两个数交换一次 所以这种逆置方法的交换次数是总长度的一半n/2;
void nizhi(sqlist *L)
{
int i,t;
for(i = 0;i <= L->length-3;i++)
{
t = L->data[i];
L->data[i] =L->data[L->length-1-i];
L->data[L->length-i-1] = t;
}
for(i = 0;i<=L->length-1;i++)
{
printf("%d\n",L->data[i]);
}
}
int main()
{
sqlist L={{1,2,3,4},4};
printf("进行逆置\n");
nizhi(&L);
}
单链表逆置
1先定义一个p 指向 头结点的指针域
2将头结点的指针域 赋值为NULL 表示头指针与后边的链表开始断开
3进入循环 p相当于一个移动靶的指针 定义一个q为当前靶的指针 用q来进行操作
4进行头插的方法
void nizhi(NODE headnode)
{
NODE q,p;
p = headnode->next;//定义移动靶指针
headnode->next = NULL;//断开链表
while(p != NULL)
{
q = p;
p = p->next;//移动靶指针
q->next = headnode->next;//头插
headnode->next = q;
}
}
完整代码
typedef struct node
{
struct node *next;
int data;
}lnode,*NODE;
NODE createlist()
{
NODE headnode = (NODE)malloc(sizeof(lnode));
headnode->next = NULL;
return headnode;
}
void backinsert(NODE headnode)
{
NODE p = headnode;
int x;
printf("请输入\n");
scanf("%d",&x);
while(x != 0)
{
p->next = (NODE)malloc(sizeof(lnode));
p = p->next;
p->data = x;
scanf("%d",&x);
}
p->next = NULL;
}
void nizhi(NODE headnode)
void print(NODE headnode)
{
NODE pmove = headnode->next;
while(pmove != NULL)
{
printf("%d",pmove->data);
pmove = pmove->next;
}
}
int main()
{
NODE headnode = createlist();
printf("即将进行逆置\n");
backinsert(headnode);//尾插建立链表
nizhi(headnode);
print(headnode);
}