#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node * next;
}Node,*LinkList;
//LinkList与Node*同为结构体指针
void InitList(LinkList* L) //初始化单链表
{
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
}
//头指针即一级指针传值是单向的,函数不能对头指针的值做修改。所以需要通过二级指针向函数传递头指针的地址来修改头指针的值从而给头指针赋值。
//L是指向单链表的头结点的指针,用来接受主程序中待初始化单链表的头指针变量的地址,*L相当于主程序中待初始化单链表的头指针变量。
void CreatFromHead(LinkList L)//头插法
{
Node *s;
int flag = 1;
int c;
while(flag)
{
printf("请输入插入的数字:");
scanf("%d",&c);
if(c!=0)
{
s = (Node*)malloc(sizeof(Node));
s->data = c;
s->next = L->next;
L->next = s;
}
else
{
flag = 0;
}
}
}
void CreatFromTail(LinkList L)//尾插法
{
Node *r,*s;
int flag = 1;
int c;
r = L;
while(flag)
{
printf("请输入插入的数字(输入0结束):");
scanf("%d",&c);
if(c!=0)
{
s = (Node*)malloc(sizeof(Node));
s->data = c;
r->next = s;
r = s;
}
else
{
flag = 0;
r->next = NULL;
}
}
}
void ergodic(LinkList L)//遍历单链表
{
Node * r;
r = L->next;
while(r!= NULL)
{
printf("%d\t",r->data);
r = r->next;
}
printf("\n");
}
void reverse(LinkList L)//逆序
{
Node * p, *s;//断开头结点
p = L->next;
L->next= NULL;
while(p!= NULL)//or p->ne
{
s = (Node*)malloc(sizeof(Node));
s->data = p->data;
s->next = L->next;
L->next = s;
p = p->next;
}
}
void sort(LinkList L)//非递减有序单链表
{
Node *p, *s;
p = L->next;
s = p->next;
int t;
while(p->next!=NULL)
{
s = p->next;
while(s!=NULL)
{
if(s->data<p->data)
{
t = s->data;
s->data = p->data;
p->data = t;
}
s = s->next;
}
p = p->next;
}
}
LinkList MergeLinkList(LinkList LA, LinkList LB)//合并
{
Node *pa, *pb,*r;
LinkList LC;
pa = LA->next;
pb = LB->next;
LC = LA;
LC->next = NULL;
r = LC;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<=pb->data)
{
r->next = pa;
r = pa;
pa = pa->next;
}
else
{
r->next = pb;
r = pb;
pb = pb->next;
}
}
if(pa)
{
r->next = pa;
}
else
{
r->next = pb;
}
free(LB);
return(LC);
}
void InsList(LinkList L,int e)//插入
{
Node *p, *s;
p = L->next;
s = (Node *)malloc(sizeof(Node));
while(p!=NULL)
{
if(e<=p->data)
{
s->data = e;
s->next = p->next;
p->next = s;
break;
}
else if (p->next==NULL&&e>p->data)//直接将最后一个元素加入链表尾部
{
s->data = e;
s->next = p->next;
p->next = s;
break;
}
else
{
p = p->next;
}
}
}
void Delete(LinkList L, int e)//删除
{
Node *pr ,*s, *r;
pr = L;
r = L->next;
while(r!=NULL)
{
if(e == r->data)
{
s = (Node*)malloc(sizeof(Node));
r = r->next;
s = pr->next;
pr->next = s->next;
free(s);
}
else if(e == r->data&&r->next==NULL)
{
s = (Node*)malloc(sizeof(Node));
s = pr->next;
pr->next = s->next;
free(s);
}
else
{
r = r->next;
pr = pr->next;
}
}
}
int main()
{
Node* Lp,*Lq,*Lr;
InitList(&Lp);
InitList(&Lq);
InitList(&Lr);
int a;
int x = 1;
int m;//插入数字
int n;//删除数字
while(x)
{
printf("1.建立单链表(元素非0)\n");
printf("2.遍历输出单链表\n");
printf("3.单链表元素逆置\n");
printf("4.建立非递减有序单链表\n");
printf("5.合并两个非递减有序单链表\n");
printf("6.在非递减有序单链表中插入一个元素\n");
printf("7.在非递减有序单链表中删除值为x的结点\n");
printf("8.退出\n");
printf("请输入需要执行的操作:");
scanf("%d",&a);
switch (a) {
case 1:
printf("建立的第%d个链表为:\n",x);
CreatFromTail(Lp);
x++;
break;
case 2:
ergodic(Lp);
break;
case 3:
reverse(Lp);
ergodic(Lp);
break;
case 4:
sort(Lp);
ergodic(Lp);
case 5:
printf("建立的第%d个链表为:\n",x);
CreatFromTail(Lq);
Lr = MergeLinkList(Lp,Lq);
sort(Lr);
ergodic(Lr);
break;
case 6:
printf("请输入插入的数字(不能为0):\n");
scanf("%d", &m);
if(m!=0)
{
InsList(Lp,m);
ergodic(Lp);
break;
}
else
{
printf("输入错误");
break;
}
case 7:
printf("请输入删除的数字:\n");
scanf("%d",&n);
Delete(Lp,n);
ergodic(Lp);
break;
case 8:
x = 0;
break;
default:
break;
}
}
return 0;
}
数据结构单链表操作(c语言)
最新推荐文章于 2022-03-13 15:11:14 发布