题目:

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;
}