题目:
1.编写函数,实现随机产生或键盘输入一组元素,建立一个带头结点的单链表(无序)
2.编写函数,实现遍历单链表
3.编写函数,实现把单向链表中元素逆置
4.编写函数,建立一个非递减有序单链表
5.编写函数,利用以上算法,建立两个非递减有序单链表,然后合并成一个非递减链表。
6.编写函数,在非递减有序单链表中插入一个元素使链表仍然有序
7.编写函数,实现在非递减有序链表中删除值为x的结点
8.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法
题目分析:
1.单链表的类型定义
typedef int ElemType; //单链表结点类型
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
2.为了算法实现简单,最好采用带头结点的单链表。
下面是具体的程序:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node /*结点类型定义*/
{
ElemType data;
struct Node *next;
}LNode,*Linklist; /* Linklist为结构指针类型*/
//通过键盘输入表中元素值,利用头插法建单链表
void Createlist(Linklist &L)
{
Linklist p,s;
ElemType x;
L=( Linklist ) malloc ( sizeof( Node )); /*建立头结点*/
L -> next = NULL; /*建立空的单链表L*/
p = L;
scanf("%d", &x);
while(x) /* 当输入"0"时,建表结束*/
{
s = ( Linklist ) malloc ( sizeof( Node )); /*建立新结点s*/
s -> data = x;
s -> next = NULL;
p -> next = s;
p = s;
scanf("%d", &x);
}
}
//以输出的形式实现遍历单链表
void printlist(Linklist &L)
{
Linklist p;
p = L;
while(p -> next != NULL) /*存放单链表长度*/
{
p = p -> next;
printf("%d ", p->data);
}
printf("\n");
}
//逆置
void nizhi(Linklist &L)
{
Linklist p,s;
p = L -> next;
L -> next = NULL;
while(p)
{
s = p;
p = p -> next;
s -> next = L -> next;
L -> next = s;
}
}
//在非递减有序单链表中插入一个元素使链表仍然有序
void Insert(Linklist &L, ElemType x)
{
Linklist 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 Creat_Sort(Linklist &L)
{
ElemType x;
L = ( Linklist )malloc( sizeof( Node ));
L -> next = NULL;
printf("建立有序表,输入任意个整形数据以结束:\n");
scanf("%d", &x);
while(x)
{
Insert(L, x);
scanf("%d", &x);
}
}
//建立两个非递减有序单链表,然后合并成一个非递减链表
void merger(Linklist La, Linklist Lb, Linklist &Lc)
{
Linklist p, q, s, rear;
p = La -> next;
q = Lb -> next;
Lc = rear = La;
free(Lb);
while(p && q)
{
if(p -> data < q -> data)
{
s = p;
p = p -> next;
}
else
{
s = q;
q = q -> next;
}
rear -> next = s;
rear = rear -> next;
}
if(p)
{
rear -> next = p;
}
else
{
rear -> next = q;
}
}
//在非递减有序链表中删除值为x的结点
void Delete(Linklist &L, ElemType x)
{
Linklist p, q;
p = L;
q = L -> next;
while(q && q -> data != x)
{
p = q;
q = q -> next;
}
if(!q)
{
printf("\nnot deleted");
}
else
{
p -> next = q -> next;
free(q);
}
}
int main()
{
Linklist La, Lb, Lc;
ElemType x;
int n;
printf("1.随机输入一组随机的元素,建立无序的单链表,以结束\n");
printf("2.以输出的形式遍历单链表\n");
printf("3.把单向链表中元素逆置\n");
printf("4.建立一个非递减有序单链表\n");
printf("5.建立两个非递减有序单链表,然后合并成一个非递减单链表\n");
printf("6.在非递减有序单链表中插入一个元素\n");
printf("7.删除指定的元素\n");
while(1)
{
printf("请选择:");
scanf("%d", &n);
switch(n)
{
case 1:
Createlist(La);
break;
case 2:
printlist(La);
break;
case 3:
nizhi(La);
printlist(La);
break;
case 4:
Creat_Sort(La);
printlist(La);
break;
case 5:
Creat_Sort(La);
Creat_Sort(Lb);
merger(La, Lb, Lc);
printlist(Lc);
break;
case 6:
Creat_Sort(La);
printlist(La);
printf("请输入要插入的元素x:");
scanf("%d", &x);
Insert(La, x);
printlist(La);
break;
case 7:
Creat_Sort(La);
printlist(La);
printf("请输入要删除的元素x:");
scanf("%d", &x);
Delete(La, x);
printlist(La);
break;
default :
printf("输入有误,请重新选择!\n");
}
}
system("pause");
return 0;
}
本文出自 “无心的执着” 博客,转载请与作者联系!