单链表

来源:互联网 发布:懒人做饭知乎 编辑:程序博客网 时间:2024/06/03 14:51

题目:

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


本文出自 “无心的执着” 博客,转载请与作者联系!

0 0
原创粉丝点击