#include <stdio.h>
#include <stdlib.h>
#define Max_size 100
typedef struct SqList
{
int arr[Max_size];
int length;
}SqList;
void InitList(SqList* L)
{
L->length=0;
}
void PutList(SqList* L)
{
int i=0;
for(i=0;i<10;i++)
{
L->arr[i]=i;
L->length++;
}
}
void SwapList(SqList* L)
{
int temp=0;
int i=0;
for(i=0;i<L->length/2;i++)
{
temp=L->arr[L->length-i-1];
L->arr[L->length-i-1]=L->arr[i];
L->arr[i]=temp;
}
}
void Print(SqList* L)
{
int i=0;
for(i=0;i<L->length;i++)
{
printf("%d ",L->arr[i]);
}
printf("\n");
}
///
typedef struct LNode
{
int elem;
struct LNode* next;
}*LinkList,LNode;
///求单链表的长度
int ListLength(LNode* L)
{
int len=0;
LinkList t;
t=L;
while(t->next!=NULL)
{
t=t->next;
len++;
}
return len;
}
//链表的初始化
void InitLNode(LNode* L)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
//尾插法创建链表
void CreateFromWei(LNode* L)
{
LinkList r;
LNode* p;
int flag=1;
int c=1;
r=L;
while(c!=0)
{
scanf("%d",&c);
p=(LinkList)malloc(sizeof(LNode));
p->elem=c;
r->next=p;
r=p;
}
r->next=NULL;
}
//链表的逆置
void SwapLNode(LNode* L,int len)
{
LinkList p,r,n;
int temp;
int i=0;
int j=0;
p=L->next;
r=p->next;
while(i<len)
{
j=0;
while(j<len-i-1)
{
temp=r->elem;
r->elem=p->elem;
p->elem=temp;
r=r->next;
p=p->next;
j++;
}
p=L->next;
r=p->next;
i++;
}
}
void Print2(LNode* L)
{
LinkList r;
r=L;
while(r->next)
{
r=r->next;
if(r->elem==0)
{
printf(" ");
}
else
{
printf("%d ",r->elem);
}
}
}
int main()
{
SqList L;
InitList(&L);
PutList(&L);
printf("打印原线性表\n");
Print(&L);
SwapList(&L);
printf("打印逆置线性表\n");
Print(&L);
//
LNode L;
InitLNode(&L);
printf("请输入单链表(输入数字0结束输入)\n");
CreateFromWei(&L);
printf("单链表逆置\n");
SwapLNode( &L, ListLength(&L));
Print2(&L);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
已知由一个线性链表表示的线性表中含有三类字符的数据元素,是编写算法将该线性表分割为三个循环链表分别存储不同种类字符
typedef struct LNode
{
int elem;
struct LNode* next;
}*LinkList,LNode;
//储存数字
typedef struct LNode2
{
int num;
struct LNode2* next;
}*LinkList2,LNode2;
//储存字母
typedef struct LNode3
{
int nor;
struct LNode3* next;
}*LinkList3,LNode3;
//尾插法创建链表
void CreateFromWei1(LNode* L)
{
LinkList r;
LNode* p;
int flag=1;
int c=1;
r=L;
while(c!='0')
{
c=getchar();
p=(LinkList)malloc(sizeof(LNode));
p->elem=c;
r->next=p;
r=p;
}
r->next=NULL;
}
//分别给链表L,L1,L2的初始化
void InitLNode(LNode* L)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
void InitLNode2(LNode2* L2)
{
L2=(LinkList2)malloc(sizeof(LNode2));
L2->next=NULL;
}
void InitLNode3(LNode3* L3)
{
L3=(LinkList3)malloc(sizeof(LNode3));
L3->next=NULL;
}
//尾插法创建链表
void CreateFromWei(LNode* L)
{
LinkList r;
LNode* p;
int flag=1;
int c=1;
r=L;
while(c!=0)
{
scanf("%d",&c);
p=(LinkList)malloc(sizeof(LNode));
p->elem=c;
r->next=p;
r=p;
}
r->next=NULL;
}
//链表的逆置
void SwapLNode(LNode* L,int len)
{
LinkList p,r,n;
int temp;
int i=0;
int j=0;
p=L->next;
r=p->next;
while(i<len)
{
j=0;
while(j<len-i-1)
{
temp=r->elem;
r->elem=p->elem;
p->elem=temp;
r=r->next;
p=p->next;
j++;
}
p=L->next;
r=p->next;
i++;
}
}
//打印函数,分别打印L2 L1 L的循环链表内容
void Print2(LNode* L)
{
LinkList r;
r=L;
while(r->next!=L)
{
r=r->next;
if(r->elem==48)
{
printf(" ");
}
else
{
printf("%c ",r->elem);
}
}
printf("\n");
}
void Print3(LNode2* L2)
{
LinkList2 r;
r=L2;
while(r->next!=L2)
{
r=r->next;
if(r->next==0)
{
printf(" ");
}
else
{
printf("%c ",r->num);
}
}
printf("\n");
}
void Print4(LNode3* L3)
{
LinkList3 r;
r=L3;
while(r->next!=L3)
{
r=r->next;
if(r->nor==0)
{
printf(" ");
}
else
{
printf("%c ",r->nor);
}
}
printf("\n");
}
//分配字符
void Assign(LNode* L,LNode2* L2,LNode3* L3)
{
LinkList r,p1,tmp;
LinkList2 p2,r2;
LinkList3 p3,r3;
tmp=L;
r=L;
p1=L;
p2=L2;
r2=L2;
p3=L3;
r3=L3;
r=r->next;
while(r->next!=L)
{
if('a'<=(r->elem)&&(r->elem)<='z'||'A'<=(r->elem)&&(r->elem)<='Z')
{
//尾插法创建链表L3,分配字母字符给链表L3
p3=(LinkList3)malloc(sizeof(LNode3));
p3->nor=r->elem;
r3->next=p3;
r3=p3;
r3->next=L3;
//讨论字符串有没有到达最后
if(r->next->elem=='0')//字符串到到达最后
{
//r指向重点需要将r->next指向头节点形成循环链表
p1->next=r->next;
p1=r;
r=r->next;
free(p1);
r->next=L;
}
else
{//字符串没有到达最后
p1->next=r->next;
p1=r;
r=r->next;
free(p1);
p1=tmp;
}
}
else if('0'<=r->elem&&(r->elem)<='9')
{
//尾插法创建链表L2,分配空间后将数字存入链表
p2=(LinkList2)malloc(sizeof(LNode2));
p2->num=r->elem;
r2->next=p2;
r2=p2;
r2->next=L2;
//讨论链表L1的指针r有没有指向终点
if(r->next->elem=='0')
{
//r指向重点需要将r->next指向头节点形成循环链表
p1->next=r->next;
p1=r;
r=r->next;
free(p1);
r->next=L;
}
else
{
p1->next=r->next;
p1=r;
r=r->next;
free(p1);
p1=tmp;
}
}
//遍历的字母为特殊字符时
else
{
p1=r;
tmp=r;
r=r->next;
if(r->elem=='0')
{
r->next=L;
}
}
}
}
int main()
{
LNode L;
LNode2 L2;
LNode3 L3;
InitLNode(&L);
InitLNode2(&L2);
InitLNode3(&L3);
printf("请输入数据(输入数字0结束输入)\n");
CreateFromWei1(&L);
Assign(&L,&L2,&L3);
printf("打印特殊字符\n");
Print2(&L);
printf("打印数字\n");
Print3(&L2);
printf("打印普通字符\n");
Print4(&L3);
return 0;
}