#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
//定义结点类型
typedef struct Node
{
ElemType data;
struct Node *next;
}LNode,*LinkList;
//单链表的建立1,头插法建立单链表,逆序生成
LinkList LinkListCreateH()
{
LinkList L,p;
L = (LinkList)malloc(sizeof(LNode));
L->data = -1;
L->next = NULL;
ElemType x;
while(scanf("%d",&x)!=EOF)
{
p = (LinkList)malloc(sizeof(LNode));
p->data = x;
p->next = L->next;
L->next = p;
}
return L;
}
//单链表的建立2,尾插法建立单链表
LinkList LinkListCreateT()
{
LinkList L,p,q;
L = (LinkList)malloc(sizeof(LNode));
L->data = -1;
L->next = NULL;
q=L;
ElemType x;
while(scanf("%d",&x)!=EOF)
{
p = (LinkList)malloc(sizeof(LNode));
p->data = x;
q->next = p;
q=p;
}
q->next = NULL;
return L;
}
//单链表的插入,在链表的第i个位置插入x的元素
LinkList LinkListInsert(LinkList L,int i,ElemType x)
{
LinkList p,q;
p = L;
for(int temp=0;temp<i;++temp)
p = p->next;
q = (LinkList)malloc(sizeof(LNode));
q->data = x;
q->next = p->next;
p->next = q;
return L;
}
//单链表的删除,在链表中删除值为x的元素
LinkList LinkListDelete(LinkList L,ElemType x)
{
LinkList p,q;
p=q = L;//不能为L->next,不然当删除第一个元素时会出错
while(p->next->data!=x)
p = p->next;
if(p->next)
{
q=p->next;
p->next=q->next;
free(q);
}
return L;
}
//单链表逆置
LinkList LinkListReverse(LinkList L)
{
printf("逆置开始");
LinkList p,q;
p=q=L->next;
L->next = NULL;
while(p)
{
q=p->next;
p->next = L->next;
L->next = p;
p=q;
}
return L;
}
//单链表排序
LinkList LinkListSort(LinkList L)
{
printf("排序开始!");
LinkList p,q;
int temp;
for (p=L->next;p!=NULL;p=p->next)
{
for (q=p->next;q!=NULL;q=q->next)
{
if(q->data<p->data)
{
temp=q->data;
q->data = p->data;
p->data = temp;
}
}
}
return L;
}
//主函数
int main()
{
LinkList list,start;
printf("输入单链表的数据:\n");
list = LinkListCreateT();
for(start = list->next;start!=NULL;start=start->next)
printf("%3d",start->data);
printf("创建成功,请输入插入的元素位置及数据:\n");
int x,y;
scanf("%d,%d",&x,&y);
LinkListInsert(list,x,y);
for(start = list->next;start!=NULL;start=start->next)
printf("%3d",start->data);
printf("插入成功,请输入删除的元素:\n");
int z;
scanf("%d",&z);
LinkListDelete(list,z);
for(start = list->next;start!=NULL;start=start->next)
printf("%3d",start->data);
printf("将单链表进行逆置吗?");
int flag;
scanf("%d",&flag);
if(flag==1)
LinkListReverse(list);
else
printf("不逆置!");
for(start = list->next;start!=NULL;start=start->next)
printf("%3d",start->data);
printf("将单链表进行排序吗?");
int flag1;
scanf("%d",&flag1);
if(flag1==1)
LinkListSort(list);
else
printf("不排序!");
for(start = list->next;start!=NULL;start=start->next)
printf("%3d",start->data);
return 0;
}
单链表操作系列
最新推荐文章于 2023-09-20 20:19:36 发布