要求:
1.编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序)
2.编写函数,实现遍历单链表
3.编写函数,实现把单向链表中元素逆置
4.编写函数,建立一个非递减有序单链表
5.编写函数,利用以上算法,建立两个非递减有序单链表,然后合并成一个非递减链表。
6.编写函数,在非递减有序单链表中插入一个元素使链表仍然有序
7.编写函数,实现在非递减有序链表中删除值为x的结点
8.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法
代码:
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node, *Linklist;
void Createheadlist(Linklist &L) //建立一个带头结点的单链表
{
Node *p, *s;
ElemType x;
L = (Linklist)malloc(sizeof(Node)); //动态空间申请
L->next = NULL;
p = L;
printf("请输入你的数据元素:>\n");
scanf("%d", &x);
while (x != 0)
{
s = (Linklist)malloc(sizeof(Node));
s->data = x;
s->next = NULL;
p->next = s;
p = s;
scanf("%d", &x);
}
printf("带有头节点的单链表建立成功!\n");
printf("\n");
printf("\n");
}
void printlist(Linklist L) //遍历单链表(输出)
{
Node *p;
p = L;
while (p->next != NULL)
{
p = p->next;
printf("%d", p->data);
printf("\t");
}
printf("\n");
}
void reverse(Linklist &L) //逆置单链表
{
Node *p, *s;
p = L->next;
L->next = NULL;
while (p) {
s = p;
p = p->next;
s->next = L->next;
L->next = s;
}
}
void Insertelement(Linklist &L, ElemType x) //在非递减有序单链表中插入一个元素使链表仍然有序
{
Node *p, *s;
s = (Linklist)malloc(sizeof(Node));
s->data = x;
p = L;
while (p->next && p->next->data <= x)
p = p->next;
s->next = p->next;
p->next = s;
}
void Createundecrease(Linklist &L) //建立一个非递减有序单链表
{
ElemType y;
L = (Linklist)malloc(sizeof(Node));
L->next = NULL;
printf("输入以0结束的整型数据:\n");
scanf("%d", &y);
while (y) {
Insertelement(L, y);
scanf("%d", &y);
}
}
Linklist combine(Linklist LA, Linklist LB)
//将递增有序的单链表LA和LB合并成一个递增有序的单链表LC
{
Node *pa, *pb;
Node *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) //若表LA未完,将表LA中后续元素链到新表LC表尾
r->next = pa;
else //否则将表LB中后续元素链到新表LC表尾
r->next = pb;
free(LB);
return(LC);
}
void Deletelement(Linklist &L, ElemType x) //在非递减有序链表中删除值为x的结点
{
Node *p, *q;
p = L;
q = L->next;
while (q && q->data != x) {
p = q;
q = q->next;
}
if (!q)
printf("\n not deleted");
else { p->next = q->next; free(q); }
}
int main()
{
Linklist L1, L2, L3;
Node *p;
L1 = (Node*)malloc(sizeof(Node));
L1->next = NULL;
ElemType x;
int select;
printf("################################################################################\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("################ 单链表的操作 ##################\n");
printf("################ 1.建立单链表,以0结束 ##################\n");
printf("################ 2.遍历单链表 ##################\n");
printf("################ 3.把单向链表中元素逆置 ##################\n");
printf("################ 4.建立一个非递减有序单链表 ##################\n");
printf("################ 5.建立两个非递减有序单链表,然后合并成一个非递减链表 ######\n");
printf("################ 6.在非递减有序单链表中插入一个元素仍然有序 #################\n");
printf("################ 7.在非递减有序链表中删除指定的元素 #################\n");
printf("################ 0.退出程序 #################\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("################################################################################\n");
while (true) {
printf("Please Enter your select: >");
scanf("%d", &select);
switch (select)
{
case 1:
Createheadlist(L1);
break;
case 2:
printf("你所建立的单链表是:\n");
printlist(L1);
printf("\n");
break;
case 3:
printf("逆置后的单链表为:\n");
reverse(L1);
printlist(L1);
printf("\n");
break;
case 4:
Createundecrease(L1);
printlist(L1);
printf("\n");
break;
case 5:
Createundecrease(L1);
printf("单链表 A 中元素为:\n");
p = L1->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
L2 = (Node*)malloc(sizeof(Node));
L2->next = NULL;
Createundecrease(L2);
printf("单链表 B 中元素为:\n");
p = L2->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
L3 = combine(L1, L2);
printf("单链表 C 中元素为:\n");
p = L3->next;
while (p != NULL)
{
printf("%d", p->data);
p = p->next;
}
printf("\n");
break;
case 6:Createundecrease(L1);
printlist(L1);
printf("请输入你想要插入的元素 x :");
scanf("%d", &x);
Insertelement(L1, x);
printlist(L1);
printf("\n");
break;
case 7:Createundecrease(L1);
printlist(L1);
printf("请输入你想要删除的元素 x :");
scanf("%d", &x);
Deletelement(L1, x);
printlist(L1);
printf("\n");
break;
case 0:
printf("退出程序!\n");
break;
default:printf("Select error! Please Enter your select again: >");
printf("\n");
break;
}
}
}