1.顺序表练习
2.链表练习
#include "head.h"
int main(int argc, const char *argv[])
{
Linklist L=LinklistCreateHead();
if(L==NULL)
return -1;
#if 0
//头插:永远在头结点后插入
datatype e;
int n=5;
for(int i=0;i<n;i++)
{
scanf("%c",&e);
getchar();
InsertHead(L,e);
}
LinklistShow(L);
#endif
//尾插
datatype e;
int n=5;
for(int i=0;i<n;i++)
{
scanf("%c",&e);
getchar();
InsertRear(L,e);
}
LinklistShow(L);
//头删:永远删除头节点的后继节点
DeleteHead(L);
LinklistShow(L);
//尾删
DeleteRear(L);
LinklistShow(L);
//任意位置插入
int pos;
datatype e1;
printf("输入插入的位置:");
scanf("%d",&pos);
printf("输入插入的字符:");
getchar();
scanf("%c",&e1);
int flag=InserByPos(L,pos,e1);
if(flag==0)
LinklistShow(L);
//任意位置删除
int pos1;
printf("输入删除的位置:");
scanf("%d",&pos1);
int flag1=DeleteByPos(L,pos1);
if(flag1==0)
LinklistShow(L);
#if 0
//链表按位置查找
int pos2;
printf("输入需要查找的位置:");
scanf("%d",&pos2);
SearchByPos(L,pos2);
//链表按位置修改
int pos4;
datatype e4;
printf("输入修改的位置:");
scanf("%d",&pos4);
printf("输入修改的字符:");
getchar();
scanf("%c",&e4);
int flag2=UpdateByPos(L,pos4,e4);
if(flag2==0)
LinklistShow(L);
#endif
//按元素查找
datatype e5;
printf("输入需要查找的元素:");
getchar();
scanf("%c",&e5);
Linklist p2=SearchByData(L,e5);
if(p2==NULL)
printf("查找失败\n");
else
printf("%c在链表中出现\n",p2->data);
//按元素修改
datatype key2;
datatype e6;
printf("输入修改的元素:");
getchar();
scanf("%c",&e6);
printf("输入修改后的值:");
getchar();
scanf("%c",&key2);
int flag3=UpdataByData(L,e6,key2);
if(flag3==0)
LinklistShow(L);
//逆置
printf("逆置:\n");
LinklistRec(L);
LinklistShow(L);
//降序排序
printf("降序排序:\n");
LinklistSort(L);
LinklistShow(L);
//释放空间
LinklistFree(L);
L=NULL;
return 0;
}
#ifndef N
#define N
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
typedef struct node
{
//数据域
union
{
int len;
datatype data;
};
struct node *next;
}*Linklist,Node;
Linklist LinklistCreateHead();
Linklist LinklistCreatenode();
void InsertHead(Linklist L,datatype e);
void LinklistShow(Linklist L);
void InsertRear(Linklist L,datatype e);
void DeleteHead(Linklist L);
void DeleteRear(Linklist L);
int InserByPos(Linklist L,int pos,datatype e);
int DeleteByPos(Linklist L,int pos);
void SearchByPos(Linklist L,int pos);
int UpdateByPos(Linklist L,int pos,datatype e);
void LinklistRec(Linklist L);
Linklist SearchByData(Linklist L,datatype key);
int UpdataByData(Linklist L,datatype e,datatype key);
void LinklistSort(Linklist L);
void LinklistFree(Linklist L);
#endif
#include "head.h"
Linklist LinklistCreateHead()
{
Linklist L=(Linklist)malloc(sizeof(Node));
if(L==NULL)
return NULL;
//节点创建成功
L->len=0;//链表长度
L->next=NULL;
return L;
}
//创建普通结点
Linklist LinklistCreatenode()
{
Linklist p=(Linklist)malloc(sizeof(Node));
if(p==NULL)
return NULL;
p->data=0;//表示创建结点的数据域清零
p->next=NULL;//表示创建新节点指针域为空
return p;
}
//头插
void InsertHead(Linklist L,datatype e)
{
//1.创建新结点
Linklist p=LinklistCreatenode();
if(p==NULL)
return;
//节点创建成功
p->data=e;//为新节点数据域赋值
p->next=L->next;
L->next=p;
L->len++;
}
//遍历链表
void LinklistShow(Linklist L)
{
Linklist p=L;
for(int i=0;i<L->len;i++)
{
p=p->next;
printf("%c\t",p->data);
}
printf("\n");
}
//尾插
void InsertRear(Linklist L,datatype e)
{
//创建一个新节点
Linklist p=LinklistCreatenode();
if(p==NULL)
return;
//找到最后一个结点
Linklist q=L;
while(q->next!=NULL)
{
q=q->next;
}
p->data=e;
q->next=p;
L->len++;
}
//头删
void DeleteHead(Linklist L)
{
if(L->len==0)
return;
Linklist p=L->next;
L->next=p->next;
free(p);
p=NULL;
L->len--;
}
//尾删
void DeleteRear(Linklist L)
{
if(L->len==0)
return;
Linklist p=L;
for(int i=0;i<L->len-1;i++)
{
p=p->next;
}
free(p->next);
p->next=NULL;
L->len--;
}
//任意位置插入
int InserByPos(Linklist L,int pos,datatype e)
{
if(L->len==0||pos<1||pos>L->len+1)
{
printf("插入失败\n");
return -1;
}
Linklist p=L;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
Linklist s=LinklistCreatenode();
if(s==NULL)
{
printf("定义失败\n");
return -1;
}
s->data=e;
s->next=p->next;
p->next=s;
L->len++;
return 0;
}
//任意位置删除
int DeleteByPos(Linklist L,int pos)
{
if(L->len==0||pos<1||pos>L->len)
{
printf("删除失败\n");
return -1;
}
Linklist p=L;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
Linklist q=p->next;
p->next=q->next;
free(q);
q=NULL;
L->len--;
return 0;
}
//链表按位置查找
void SearchByPos(Linklist L,int pos)
{
if(L->len==0||pos<1||pos>L->len)
{
printf("查找失败\n");
return;
}
Linklist p=L;
for(int i=0;i<pos;i++)
{
p=p->next;
}
printf("需要查找的元素是:%c\n",p->data);
}
//链表按位置修改
int UpdateByPos(Linklist L,int pos,datatype e)
{
if(L->len==0||pos<1||pos>L->len)
{
printf("修改失败\n");
return -1;
}
Linklist p=L;
for(int i=0;i<pos;i++)
{
p=p->next;
}
p->data=e;
return 0;
}
//逆置
void LinklistRec(Linklist L)
{
Linklist p=L->next;
L->next=NULL;
while(p)
{
Linklist t=p;
p=p->next;
t->next=L->next;
L->next=t;
}
}
//按元素查找
Linklist SearchByData(Linklist L,datatype key)
{
if(L->len==0)
{
return NULL;
}
Linklist p=L;
for(int i=1;i<=L->len;i++)
{
p=p->next;
if(p->data==key)
{
return p;
}
return NULL;
}
}
//按元素修改
int UpdataByData(Linklist L,datatype e,datatype key)
{
Linklist p=SearchByData(L,e);
if(p==NULL)
{
printf("元素不存在,查找失败\n");
return -1;
}
p->data=key;
return 0;
}
//降序排序
void LinklistSort(Linklist L)
{
Linklist p=L->next;
L->next=NULL;
while(p)
{
Linklist t=p;
p=p->next;
Linklist q=L;
while(q->next!=NULL&&q->next->data>t->data)
{
q=q->next;
}
t->next=q->next;
q->next=t;
}
}
//释放空间
void LinklistFree(Linklist L)
{
if(L==NULL)
return;
for(int i=0;i<L->len;i++)
{
DeleteHead(L);
}
free(L);
L=NULL;
}