链表的转置
注:主要还是为了测试链表的功能,题目是次要的ouo
什么是链表的转置呢,打个比方:
转置前 1-2-3-4-5
转置后 5-4-3-2-1
首先声明函数
#ifndef __LINKLIST__
#define __LINKLIST__
typedef int datatype;
typedef struct node_t
{
datatype data;
struct node_t *next;
}linklist_t;
linklist_t* createlinklist(void);
int insertlinklist(linklist_t *p,int post,datatype data);
int lengthlinklist(linklist_t *p);
void showlinklist(linklist_t *p);
int dellinklist(linklist_t* p,int post);
int selbypostlinklist(linklist_t *p,int post);
int selbydatalinklist(linklist_t *p,datatype data);
void clearlinklist(linklist_t *p);
int zhuanzhi(linklist_t *p);
#endif
功能实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"linklist.h"
linklist_t* createlinklist(void)
{
linklist_t *p=(linklist_t *)malloc(sizeof(linklist_t));
if(p==NULL)
{
puts("创建失败");
return NULL;
}
p->next=NULL;
return p;
}
//链表长度
int lengthlinklist(linklist_t * p)
{
int len=0;
while(p->next!=NULL)
{
p=p->next;
len++;
}
return len;
}
//插入
int insertlinklist(linklist_t *p,int post,datatype data)
{
linklist_t* pnew=NULL;
pnew=(linklist_t*)malloc(sizeof(linklist_t));
if(pnew==NULL)
{
puts("malloc pnew fail");
return -1;
}
pnew->data=data;
pnew->next=NULL;
if(post<0||post>lengthlinklist(p))
{
puts("插入失败");
return -1;
}
int i;
for(i=0;i<post;i++)
p=p->next;
pnew->next=p->next;
p->next=pnew;
return 0;
}
//遍历
void showlinklist(linklist_t* p)
{
if(p->next==NULL)
{
puts("链表为空\n");
}
while(p->next!=NULL)
{
p=p->next;
printf("%d ",p->data);
}
}
//删除
int dellinklist(linklist_t* p,int post)
{
linklist_t *pdel;
if(p->next==NULL)
{
puts("链表为空\n");
return -1;
}
while(post>0)
{
p=p->next;post--;
}
pdel=p->next;
p->next=pdel->next;
free(pdel);
pdel=NULL;
return 0;
}
//按位查询
int selbypostlinklist(linklist_t *p,int post)
{
if(p->next==NULL)
{
puts("链表为空");
return -1;
}
int i;
for(i=0;i<=post;i++)
{
p=p->next;
}
printf("%d ",p->data);
return 0;
}
//按值查询
int selbydatalinklist(linklist_t *p,datatype data)
{
if(p->next==NULL)
{
puts("链表为空");
return -1;
}
int i=0;
while(p->next!=NULL)
{
p=p->next;
if(p->data==data)
{
printf("%d",i);
return i;
}
i++;
}
puts("无此值");
return 0;
}
void clearlinklist(linklist_t *p)
{
linklist_t *pclear=NULL;
while(p->next!=NULL)
{
pclear=p->next;
p->next=pclear->next;
free(pclear);
pclear=NULL;
}
puts("删除链表完毕\n");
}
int zhuanzhi(linklist_t* p)
{
linklist_t *q=p->next;
linklist_t *p2=q->next;
q->next=NULL;
while(p2)
{
q=p2;
p2=q->next;
q->next=p->next;
p->next=q;
}
puts("转置完成\n");
return 0;
}
主函数
#include<stdio.h>
#include<string.h>
#include"linklist.h"
int main()
{
linklist_t *h=createlinklist();
insertlinklist(h,0,5);
insertlinklist(h,0,4);
insertlinklist(h,0,3);
insertlinklist(h,0,2);
insertlinklist(h,0,1);
showlinklist(h);
dellinklist(h,4);
showlinklist(h);
selbypostlinklist(h,3);
selbydatalinklist(h,3);
// clearlinklist(h);
showlinklist(h);
zhuanzhi(h);
showlinklist(h);
clearlinklist(h);
}