#include<stdio.h>
#include<stdlib.h>
#define MAX 30
typedef struct s //单向链表的存储结构
{
int data;
struct s *next;
}S,*LinkList;
typedef struct DuList //双向链表的存储结构
{
int data;
struct DuList *prior;
struct DuList *next;
}DuLNode,*DuLinkList;
int InitList(S *s) //创建空的单链表
{
s=(S *)malloc(sizeof(S));
s->next=NULL;
if(!s)return 0;
else return 1;
}
void ShuChu(S *p1) //输出单链表
{
while(p1!=NULL)
{
printf("%d ",p1->data);
p1=p1->next;
}
}
void CreateList(LinkList s,int n) //为所创建的单链表增加数据
{
int i,m;
S *r,*p1;
S *p;
// s=(S *)malloc(sizeof(S));
s->next=NULL;
r=s;
for(i=0;i<n;i++)
{
scanf("%d",&m);
p=(S *)malloc(sizeof(S));
p->data=m;
p->next=NULL;
r->next=p;
r=p;
}
p1=s->next;
/*while(p1!=NULL)
{
printf("%d ",p1->data);
p1=p1->next;
}*/
ShuChu(p1);
}
void ListInsert(S *s,int n,int m) //单链表中值的插入
{
int i=1;
S *p,*r,*p1;
p=(S *)malloc(sizeof(S));
r=s->next;
p->data=m;
while(i<(n-1)&&r!=NULL)
{
r=r->next;
i++;
}
if(i==n-1)
{
p->next=r->next;
r->next=p;
}
p1=s->next;
ShuChu(p1);
}
void ListDelect(S *s,int n) //单链表删除
{
int i=1;
S *p,*p1,*q;
p=s->next;
while(i<n-1&&p)
{
p=p->next;
i++;
}
if(i==n-1)
{
q=p->next;
p->next=p->next->next;
free(q);
}
p1=s->next;
ShuChu(p1);
}
void LocateElem(S *s,int m) //查找单链表中是否有要查找的值
{
S *p;
int i=1;
p=s->next;
while(p)
{
if(p->data==m)
{
printf("找到了!,其所在位置为%d",i);
break;
}
i++;
p=p->next;
}
}
int DuInitList(DuLinkList s1) //建立空的双向链表
{
s1=(DuLNode *)malloc(sizeof(DuLNode));
s1->next=NULL;
if(!s1)return 0;
else return 1;
}
void ShuChu1(DuLinkList s3) //输出双向链表中的值
{
while(s3)
{
printf("%d ",s3->data);
s3=s3->next;
}
printf("\n");
}
void CreateList_DuL(DuLinkList s2,int n) //向所创建的双向链表增加数
{
s2->next=NULL;
DuLinkList s3,r,s1;
int i=1,m;
r=s2;
while(i<=n)
{
s3=(DuLNode *)malloc(sizeof(DuLNode));
// s3->next=NULL;
scanf("%d",&m);
s3->data=m;
s3->next=NULL;
r->next=s3;
// s3->prior->next=s3;
r=s3;
i++;
}
s1=s2->next;
ShuChu1(s1);
}
void ListInsert_DuL(DuLinkList s1,int n,int m1) //向双向链表中插入数
{
DuLinkList s2,p,s3;
p=(DuLNode *)malloc(sizeof(DuLNode));
int n1=1;
s2=s1->next;
while(s2&&n1<n-1)
{
s2=s2->next;
n1++;
}
if(n1==n-1)
{
p->data=m1;
p->next=s2->next;
s2->next=p;
p->next->prior=p;
p->prior=s2;
}
s3=s1->next;
ShuChu1(s3);
}
void ListDelect_DuL(DuLinkList s2,int n) //删除双向链表第n个位置的值
{
int i=1;
DuLinkList s1,s3;
s1=s2->next;
while(i<n&&s1)
{
s1=s1->next;
i++;
}
if(n==i)
{
s1->prior->next=s1->next;
s1->next->prior=s1->prior;
//i++;
}
s3=s2->next;
ShuChu1(s3);
}
int main()
{
S s,s1;
DuLNode s2;
int m,n,m1,n1;
m=InitList(&s);
// s1=s;
if(m==1)
printf("内存分配完成!\n");
printf("请输入所创建的单链表的数据个数:\n");
scanf("%d",&n);
printf("请输入数:\n");
CreateList(&s,n);
printf("请输入要插入的数的位置及数:\n");
scanf("%d%d",&m,&n);
ListInsert(&s,m,n);
printf("请输入要删除的数的位置:\n");
scanf("%d",&n);
ListDelect(&s,n);
printf("请输入要查找的数:\n");
scanf("%d",&m);
LocateElem(&s,m);
printf("\n");
m1=DuInitList(&s2);
if(m1==1)
printf("双向链表初始化完成!\n");
printf("请输入所创建的链表的数据个数:\n");
scanf("%d",&n);
printf("请输入数:\n");
CreateList_DuL(&s2,n);
printf("请输入要插入的数的位置以及数:\n");
scanf("%d%d",&n,&m1);
ListInsert_DuL(&s2,n,m1);
printf("请输入要删除的数的位置:\n");
scanf("%d",&n);
ListDelect_DuL(&s2,n);
return 0;
}
相关文章
- 关于单链表的一个问题,只要出现L=L->next这样的语句直接崩溃
- 单链表和数组的区别
- 两个单链表头尾连接的问题
- 线性表的链式存储——单链表
- C#的链表操作[数据结构-线性表]
- 1.Go语言copy函数、sort排序、双向链表、list操作和双向循环链表
- 韩顺平_PHP程序员玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理
- 韩顺平_PHP程序员玩转算法公开课(第一季)12_双向链表crud操作之_水浒英雄排行_学习笔记_源代码图解_PPT文档整理
- 韩顺平_PHP程序员玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理
- 单链表的初始化,建立,插入,查找,删除。