题目:
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; }