数据结构 【实验4 链表其它操作】

实验要求:

实验4 链表其它操作 实验目的 1.熟悉对单链表的一些其它操作。 2.掌握循环链表和双链表的一些操作,理解与单链表操作的不同。 实验内容 程序1 设单链表L是一个非递减有序表,写一算法将x插入其中后仍保持L的有序性。 设计要求:在程序中构造三个子程序分别为 LinkedList LinkedListCreat( ) /*建立链表*/

void InsertList(LinkedList L,int x)              /*插入结点*/

void print(LinkedList L);                         /*输出链表中的结点*/ 程序2 利用原空间,将两个单链表合并成一个单链表。 设计要求:在程序中构造三个子程序分别为 LinkedList LinkedListCreat( ) /*建立链表*/ LinkedList ListConcat(LinkedList La,LinkedList Lb) /*合并链表*/

void print(LinkedList L);                         /*输出链表中的结点*/ 程序3 已知两个非递减有序的单链表la和lb,将la和lb合并成一个线性表lc,lc也非递减有序。 设计要求:在程序中构造三个子程序分别为 LinkedList LinkedListCreat( ) /*建立链表*/ LinkedList union(LinkedList La,Lb) /*合并链表*/

void print(LinkedList Lc);                         /*输出链表中的结点*/ 程序4 已知一个单链表,利用原表把单链表逆置。 设计要求:在程序中构造三个子程序分别为 LinkedList LinkedListCreat( ) /*建立链表*/

void List_reverse(LinkedList L)                   /*逆置链表*/

void print(LinkedList L);                         /*输出链表中的结点*/ 程序5 在计算机上先输入一串正整数的序列。请编写一个程序,首先用链表存储该序列。然后执行删除操作,即先从链表中找出最小的结点,删除它。然后再在剩余的链表中,找出最小的结点,再删除之。直至表空为止。 设计要求:在程序中构造四个子程序分别为 LinkedList LinkedListCreat( ) /*建立链表*/

int min(LinkedList head);                      /*求链表中的最小结点*/ LinkedList del(LinkedList head, int num);   /*删除结点*/

void print(LinkedList L);                      /*输出链表中的结点*/ 程序6 利用单循环链表作为存储结构,实现实验二中的约瑟夫环问题。 设计要求:在程序中构造三个子程序分别为 CiLinkList CiLinkListCreat( ) /*建立不带头结点的单循环链表*/

void del(CiLinkList last, int N, int K)   /*依次输出符合要求的结点*/

void print(CiLinkList L);                   /*输出链表中的结点*/ 程序7 在双向链表上实现线性表的下列运算: a) 建立 DLinkedList creat() b) 插入void DlistInsert(DLinkedList L,int x,int i) c) 删除void DlistDelete(DLinkedList L,int i) 程序8 设有一个双链表,每个结点中除有prior,next及data〔可设为正整数〕三个域之外,还有一个专门记录访问该结点次数的数据域freq,其值在初始化时为零。每当在链表中进行一次Search〔l,key〕时,则数据域data之值等于key的结点,其freq域之值将加一。并使该双链表中结点按freq之值的递减顺序排列,freq值越大的结点越靠近表头。请编写符合上述要求的Search〔l,key〕程序。 设计要求:在程序中构造三个子程序分别为 DLinkedList Creat() /*建立链表*/

void Search(DLinkedList head,int key)    /*查找链表中符合要求的结点*/

void print(DLinkedList head);              /*输出链表中的结点*/

 


 

  参考代码:

 1 /* 程序1  2 设单链表L是一个非递减有序表,写一算法将x插入其中后仍保持L的有序性。  3 设计要求:在程序中构造三个子程序分别为  4 LinkedList LinkedListCreat( ) //建立链表  5 void InsertList(LinkedList L,int x) //插入结点  6 void print(LinkedList L); //输出链表中的结点  7 */

 8 #include <stdio.h>

 9 #include <malloc.h>

10 /* 单链表的结点类型 */

11 typedef struct LNode{ 12     int data; 13     LNode* next; 14 }LNode,*LinkedList; 15 

16 LinkedList  LinkedListCreat( )                     //建立链表

17 { 18     LinkedList head = (LNode*)malloc(sizeof(LNode)); 19     head->next = NULL; 20     printf("请输入链表大小:(最多1000个)\n"); 21     int n,i,j,a[1001]; 22     scanf("%d",&n); 23     printf("请输入链表的所有元素:\n"); 24     for(i=1;i<=n;i++)    //输入元素

25         scanf("%d",&a[i]); 26     //冒泡排序

27     for(i=1;i<n;i++) 28         for(j=1;j<=n-i;j++) 29             if(a[j]>a[j+1]){ 30                 int t; 31                 t=a[j];a[j]=a[j+1];a[j+1]=t; 32  } 33     //尾插法创建链表

34     LinkedList p = head; 35     for(i=1;i<=n;i++){ 36         LinkedList t =  (LNode*)malloc(sizeof(LNode)); 37         t->data = a[i]; 38         t->next = NULL; 39         p->next = t; 40         p = t; 41  } 42     return head; 43 } 44 void InsertList(LinkedList L,int x)              //插入结点

45 { 46     LinkedList p = L->next,pre = L; 47     while(p){ 48         if(x < p->data){    //插在pre后面,p前面

49             LinkedList t =  (LNode*)malloc(sizeof(LNode)); 50             t->data = x; 51             t->next = p; 52             pre->next = t; 53             break; 54  } 55         pre = p; 56         p = p->next; 57  } 58     if(p==NULL){    //如果这个数比链表中任何一个数都大

59         LinkedList t =  (LNode*)malloc(sizeof(LNode)); 60         t->data = x; 61         t->next = NULL; 62         pre->next = t; 63  } 64 } 65 

66 void print(LinkedList L)                       //输出链表中的结点

67 { 68     LinkedList p=L->next; 69     while(p){ 70         printf("%d ",p->data); 71         p = p->next; 72  } 73     printf("\n"); 74 } 75 int main() 76 { 77     int x; 78     printf("设单链表L是一个非递减有序表,将x插入其中后仍保持L的有序性。\n"); 79     LinkedList head = LinkedListCreat(); 80     printf("请输入要插入的元素值:\n"); 81     while(scanf("%d",&x)!=EOF){ 82  InsertList(head,x); 83         printf("插入之后的单链表:\n"); 84  print(head); 85         printf("---------------------\n"); 86         printf("请输入要插入的元素值:\n"); 87  } 88     return 0; 89 }

 

 1 /* 程序2  2 利用原空间,将两个单链表合并成一个单链表。  3 设计要求:在程序中构造三个子程序分别为  4 LinkedList LinkedListCreat( ) //建立链表  5 LinkedList ListConcat(LinkedList La,LinkedList Lb) //合并链表  6 void print(LinkedList L); //输出链表中的结点  7 */

 8 #include <stdio.h>

 9 #include <malloc.h>

10 /* 单链表的结点类型 */

11 typedef struct LNode{ 12     int data; 13     LNode* next; 14 }LNode,*LinkedList; 15 

16 LinkedList  LinkedListCreat( )                     //建立链表

17 { 18     LinkedList head = (LNode*)malloc(sizeof(LNode)); 19     head->next = NULL; 20     printf("请输入链表大小:(最多1000个)\n"); 21     int n,i,a[1001]; 22     scanf("%d",&n); 23     printf("请输入链表的所有元素:\n"); 24     for(i=1;i<=n;i++)    //输入元素

25         scanf("%d",&a[i]); 26     //尾插法创建链表

27     LinkedList p = head; 28     for(i=1;i<=n;i++){ 29         LinkedList t =  (LNode*)malloc(sizeof(LNode)); 30         t->data = a[i]; 31         t->next = NULL; 32         p->next = t; 33         p = t; 34  } 35     return head; 36 } 37 

38 LinkedList ListConcat(LinkedList La,LinkedList Lb)   //合并链表

39 { 40     LinkedList head = La; 41     while(La->next){    //找到La的最后一个节点

42         La = La->next; 43  } 44     La->next = Lb->next;    //把La的最后一个节点和La的第一个节点连接上

45     return head; 46 } 47 

48 void print(LinkedList L)                       //输出链表中的结点

49 { 50     LinkedList p=L->next; 51     while(p){ 52         printf("%d ",p->data); 53         p = p->next; 54  } 55     printf("\n"); 56 } 57 

58 int main() 59 { 60     printf("利用原空间,将两个单链表合并成一个单链表。\n"); 61     printf("1.创建单链表La\n"); 62     LinkedList La = LinkedListCreat(); 63     printf("2.创建单链表Lb\n"); 64     LinkedList Lb = LinkedListCreat(); 65     printf("3.合并单链表\n"); 66     LinkedList Lc = ListConcat(La,Lb); 67     printf("合并成功!\n"); 68     printf("4.输出合并后的链表\n"); 69  print(Lc); 70     return 0; 71 }

 

 1 /* 程序3  2 已知两个非递减有序的单链表la和lb,将la和lb合并成一个线性表lc,lc也非递减有序。  3 设计要求:在程序中构造三个子程序分别为  4 LinkedList LinkedListCreat( ) //建立链表  5 LinkedList union(LinkedList La,Lb) //合并链表  6 void print(LinkedList Lc); //输出链表中的结点  7 */

 8 #include <stdio.h>

 9 #include <malloc.h>

 10 /* 单链表的结点类型 */

 11 typedef struct LNode{  12     int data;  13     LNode* next;  14 }LNode,*LinkedList;  15 

 16 LinkedList  LinkedListCreat( )                     //按顺序建立链表

 17 {  18     LinkedList head = (LNode*)malloc(sizeof(LNode));  19     head->next = NULL;  20     printf("请输入链表大小:(最多1000个)\n");  21     int n,i,j,a[1001];  22     scanf("%d",&n);  23     printf("请输入链表的所有元素:\n");  24     for(i=1;i<=n;i++)    //输入元素

 25         scanf("%d",&a[i]);  26     //冒泡排序

 27     for(i=1;i<n;i++)  28         for(j=1;j<=n-i;j++)  29             if(a[j]>a[j+1]){  30                 int t;  31                 t=a[j];a[j]=a[j+1];a[j+1]=t;  32  }  33     //尾插法创建链表

 34     LinkedList p = head;  35     for(i=1;i<=n;i++){  36         LinkedList t =  (LNode*)malloc(sizeof(LNode));  37         t->data = a[i];  38         t->next = NULL;  39         p->next = t;  40         p = t;  41  }  42     return head;  43 }  44 

 45 LinkedList Union(LinkedList La,LinkedList Lb)                //合并链表

 46 {  47     LinkedList head =  (LNode*)malloc(sizeof(LNode));  48     LinkedList p = head;  49     La = La->next,Lb = Lb->next;  50     while(La && Lb){    //比较,直到其中一个链表比较完

 51         if(La->data < Lb->data){  52             LinkedList t =  (LNode*)malloc(sizeof(LNode));  53             t->data = La->data;  54             t->next = NULL;  55             p->next = t;  56             p = p->next;  57             La = La->next;  58  }  59         else {  60             LinkedList t =  (LNode*)malloc(sizeof(LNode));  61             t->data = Lb->data;  62             t->next = NULL;  63             p->next = t;  64             p = p->next;  65             Lb = Lb->next;  66  }  67  }  68     if(La){    //La还没比较完

 69         while(La){  70             LinkedList t =  (LNode*)malloc(sizeof(LNode));  71             t->data = La->data;  72             t->next = NULL;  73             p->next = t;  74             p = p->next;  75             La = La->next;  76  }  77  }  78     else if(Lb){    //Lb还没比较完

 79         while(Lb){  80             LinkedList t =  (LNode*)malloc(sizeof(LNode));  81             t->data = Lb->data;  82             t->next = NULL;  83             p->next = t;  84             p = p->next;  85             Lb = Lb->next;  86  }  87  }  88     return head;  89 }  90 

 91 void print(LinkedList Lc)                       //输出链表中的结点

 92 {  93     LinkedList p=Lc->next;  94     while(p){  95         printf("%d ",p->data);  96         p = p->next;  97  }  98     printf("\n");  99 } 100 

101 int main() 102 { 103     printf("已知两个非递减有序的单链表la和lb,将la和lb合并成一个线性表lc,lc也非递减有序。\n"); 104     printf("1.创建单链表La\n"); 105     LinkedList La = LinkedListCreat(); 106     printf("2.创建单链表Lb\n"); 107     LinkedList Lb = LinkedListCreat(); 108     printf("3.顺序合并单链表\n"); 109     LinkedList Lc = Union(La,Lb); 110     printf("合并成功!\n"); 111     printf("4.输出合并后的链表\n"); 112  print(Lc); 113     return 0; 114 }

 

 1 /* 程序4  2 已知一个单链表,利用原表把单链表逆置。  3 设计要求:在程序中构造三个子程序分别为  4 LinkedList LinkedListCreat( ) //建立链表  5 void List_reverse(LinkedList L) //逆置链表  6 void print(LinkedList L); //输出链表中的结点  7 */

 8 

 9 #include <stdio.h>

10 #include <malloc.h>

11 /* 单链表的结点类型 */

12 typedef struct LNode{ 13     int data; 14     LNode* next; 15 }LNode,*LinkedList; 16 

17 LinkedList  LinkedListCreat( )                     //按顺序建立链表

18 { 19     LinkedList head = (LNode*)malloc(sizeof(LNode)); 20     head->next = NULL; 21     printf("请输入链表大小:(最多1000个)\n"); 22     int n,i,a[1001]; 23     scanf("%d",&n); 24     printf("请输入链表的所有元素:\n"); 25     for(i=1;i<=n;i++)    //输入元素

26         scanf("%d",&a[i]); 27     //尾插法创建链表

28     LinkedList p = head; 29     for(i=1;i<=n;i++){ 30         LinkedList t =  (LNode*)malloc(sizeof(LNode)); 31         t->data = a[i]; 32         t->next = NULL; 33         p->next = t; 34         p = t; 35  } 36     return head; 37 } 38 

39 void List_reverse(LinkedList L)                   //逆置链表

40 { 41     LinkedList p = L->next; 42     int data[1001],i; 43     for(i=1;p;i++){ 44         data[i] = p->data; 45         p = p->next; 46  } 47     p = L->next; 48     while(p){ 49         p->data = data[--i]; 50         p = p->next; 51  } 52 } 53 

54 void print(LinkedList L)                       //输出链表中的结点

55 { 56     LinkedList p=L->next; 57     while(p){ 58         printf("%d ",p->data); 59         p = p->next; 60  } 61     printf("\n"); 62 } 63 

64 int main() 65 { 66     printf("已知一个单链表,利用原表把单链表逆置。\n"); 67     printf("1.创建单链表L\n"); 68     LinkedList L = LinkedListCreat(); 69     printf("2.链表逆置\n"); 70  List_reverse(L); 71     printf("逆置成功!\n"); 72     printf("3.输出合并后的链表\n"); 73  print(L); 74     return 0; 75 }

 

 1 /* 程序5  2 在计算机上先输入一串正整数的序列。请编写一个程序,首先用链表存储该序列。  3 然后执行删除操作,即先从链表中找出最小的结点,删除它。  4 然后再在剩余的链表中,找出最小的结点,再删除之。直至表空为止。  5 设计要求:在程序中构造四个子程序分别为  6 LinkedList LinkedListCreat( ) //建立链表  7 int min(LinkedList head); //求链表中的最小结点  8 LinkedList del(LinkedList head, int num); //删除结点  9 void print(LinkedList L); //输出链表中的结点 10 */

11 

12 #include <stdio.h>

13 #include <malloc.h>

14 /* 单链表的结点类型 */

15 typedef struct LNode{ 16     int data; 17     LNode* next; 18 }LNode,*LinkedList; 19 

20 LinkedList  LinkedListCreat( )                     //按顺序建立链表

21 { 22     LinkedList head = (LNode*)malloc(sizeof(LNode)); 23     head->next = NULL; 24     printf("请输入链表大小:(最多1000个)\n"); 25     int n,i,a[1001]; 26     scanf("%d",&n); 27     printf("请输入链表的所有元素:\n"); 28     for(i=1;i<=n;i++)    //输入元素

29         scanf("%d",&a[i]); 30     //尾插法创建链表

31     LinkedList p = head; 32     for(i=1;i<=n;i++){ 33         LinkedList t =  (LNode*)malloc(sizeof(LNode)); 34         t->data = a[i]; 35         t->next = NULL; 36         p->next = t; 37         p = t; 38  } 39     return head; 40 } 41 

42 

43 int min(LinkedList head)     //求链表中的最小结点,返回其逻辑序号

44 { 45     head = head->next; 46     int min=1,val=head->data,num=1; 47     while(head){ 48         if(head->data < val)    //如果 当前节点元素值 < 之前存储的最小值

49             min = num,val = head->data; 50         head = head->next; 51         num++; 52  } 53     return min; 54 } 55 

56 LinkedList del(LinkedList head, int num)  //删除结点

57 { 58     int count = 0; 59     LinkedList p = head; 60     while(count+1!=num){    //找到要删除节点的前一个节点

61         p = p->next; 62         count++; 63  } 64     LinkedList t = (LNode*)malloc(sizeof(LNode)); 65     t = p->next;    //存储要删除的节点

66     p->next = t->next; 67     free(t);    //释放该空间

68     return head; 69 } 70 

71 

72 void print(LinkedList L)                       //输出链表中的结点

73 { 74     LinkedList p=L->next; 75     while(p){ 76         printf("%d ",p->data); 77         p = p->next; 78  } 79     printf("\n"); 80 } 81 

82 int main() 83 { 84     printf("创建一个单链表,依次删除其中值最小的节点\n"); 85     printf("1.创建单链表L\n"); 86     LinkedList L = LinkedListCreat(); 87     printf("2.依次删除链表中值最小的节点\n"); 88  getchar(); 89     printf("当前链表所有元素:\n"); 90  print(L); 91     while(L->next){ 92         printf("请按回车执行删除操作"); 93  getchar(); 94         L = del(L,min(L));    //删除当前值最小的元素

95  print(L); 96  } 97     printf("链表已空!\n"); 98     return 0; 99 }

 

 1 /* 程序6  2 利用单循环链表作为存储结构,实现实验二中的约瑟夫环问题。  3 设计要求:在程序中构造三个子程序分别为  4 CiLinkList CiLinkListCreat( ) //建立不带头结点的单循环链表  5 void del(CiLinkList last, int N, int K) //依次输出符合要求的结点  6 void print(CiLinkList L); //输出链表中的结点  7 */

 8 #include <stdio.h>

 9 #include <malloc.h>

10 /* 循环链表的结点类型 */

11 typedef struct LNode{ 12     int data; 13     LNode* next; 14 }LNode,*CiLinkList; 15 

16 CiLinkList  CiLinkListCreat( )              //建立不带头结点的单循环链表

17 { 18  CiLinkList p0,p; 19     printf("请输入链表大小:(最多1000个)\n"); 20     int n,i,e; 21     scanf("%d",&n); 22     printf("请输入循环链表的所有元素:\n"); 23     for(i=1;i<=n;i++){    //输入元素

24         scanf("%d",&e); 25         CiLinkList t = (LNode*)malloc(sizeof(LNode));    //创建节点,与之前的相连

26         t->data = e; 27         t->next = NULL; 28         if(i==1)    //第一个节点

29             p0 = t,p = t; 30         else{ 31             p->next = t; 32             p = p->next; 33  } 34  } 35     p->next = p0;    //首尾相连

36     return p0; 37 } 38 void del(CiLinkList last, int N, int K)     //依次输出符合要求的结点

39 { 40     int num = 0; 41     while(last!=last->next){    //直到循环链表为空

42         while(num+1!=K-1){    //找到要删除节点的上一个节点

43             last = last->next; 44             num++; 45  } 46         //删除节点

47         CiLinkList t = last->next; 48         last->next = t->next; 49         printf("%d ",t->data); 50  free(t); 51         last = last->next;    //跳到被删除节点的下一个节点,重新开始循环

52         num = 0; 53  } 54     printf("%d ",last->data); 55     printf("\n"); 56 } 57 void print(CiLinkList L)                  //输出链表中的结点

58 { 59     CiLinkList p = L->next; 60     printf("%d ",L->data);    //输出第一个元素

61     while(p!=L){ 62         printf("%d ",p->data);    //输出剩下的元素

63         p = p->next; 64  } 65     printf("\n"); 66 } 67 

68 int main() 69 { 70     CiLinkList L = CiLinkListCreat();    //创建循环链表

71     printf("符合要求的顺序应为:\n"); 72     del(L, 10, 3) ;    //依次输出符合要求的结点

73     return 0; 74 }

 

 1 /* 程序7  2 在双向链表上实现线性表的下列运算:  3 a) 建立 DLinkedList creat()  4 b) 插入void DlistInsert(DLinkedList L,int x,int i)  5 c) 删除void DlistDelete(DLinkedList L,int i)  6 */

 7 #include <stdio.h>

 8 #include <malloc.h>

 9 #include <stdlib.h>

 10 typedef struct LNode{  11     int data;  12     LNode* pre;  13     LNode* next;  14 } LNode,*DLinkedList;  15 DLinkedList creat()  16 {  17     DLinkedList head = (LNode*)malloc(sizeof(LNode)),p = head;  18     head->next = NULL;  19     head->pre = NULL;  20     printf("请输入链表大小:(最多1000个)\n");  21     int n,i,e;  22     scanf("%d",&n);  23     if(n<=0 || n>1000){  24         printf("请输入正确的链表大小!\n");  25         head = NULL;  26         return head;  27  }  28     printf("请输入循环链表的所有元素:\n");  29     for(i=1;i<=n;i++){    //输入元素

 30         scanf("%d",&e);  31         DLinkedList t = (LNode*)malloc(sizeof(LNode));    //创建节点

 32         t->data = e;  33         t->next = NULL;  34         t->pre = p;  35         p->next = t;  36         p = p->next;  37  }  38     return head;  39 }  40 void  DlistInsert(DLinkedList L,int x,int i)  41 {  42     int num = 0;  43     while(num<i && L){  44         L = L->next;  45         num++;  46  }  47     if(!L){  48         printf("插入失败,您要插入的位置已超过链表长度!\n");  49         return ;  50  }  51     DLinkedList pre = L->pre;  52     DLinkedList t = (LNode*)malloc(sizeof(LNode));  53     t->data = x;  54     t->next = L;  55     t->pre = pre;  56     L->pre = t;  57     pre->next = t;  58 }  59 void  DlistDelete(DLinkedList L,int i)  60 {  61     int num = 0;  62     while(num<i && L){    //找到要删除的位置

 63         L = L->next;  64         num++;  65  }  66     if(!L){  67         printf("删除失败,您要删除的位置已超过链表长度!\n");  68         return ;  69  }  70     DLinkedList pre = L->pre;  71     pre->next = L->next;  72     if(L->next!=NULL)  73         L->next->pre = pre;  74  free(L);  75 }  76 

 77 void print(DLinkedList L)                  //输出链表中的结点

 78 {  79     L = L->next;  80     while(L){  81         printf("%d ",L->data);    //输出剩下的元素

 82         L = L->next;  83  }  84     printf("\n");  85 }  86 int menu()  87 {  88     int in;  89     printf("[1] 创建双链表\n");  90     printf("[2] 插入元素\n");  91     printf("[3] 删除元素\n");  92     printf("[4] 输出链表\n");  93     printf("[0] 按任意键退出\n");  94     scanf("%d",&in);  95     return in;  96 }  97 DLinkedList work(DLinkedList head ,int in)  98 {  99     switch(in){ 100         case 1: 101             head = creat(); 102             break; 103         case 2: 104             if(head==NULL){ 105                 printf("请先创建双链表!\n"); 106                 break; 107  } 108             int i,x; 109             printf("你要在第几个位置插入元素?\n"); 110             scanf("%d",&i); 111             printf("你要插入的元素值是?\n"); 112             scanf("%d",&x); 113  DlistInsert(head,x,i); 114             printf("当前链表:\n"); 115  print(head); 116             break; 117         case 3: 118             if(head==NULL){ 119                 printf("请先创建双链表!\n"); 120                 break; 121  } 122             int n; 123             printf("你要删除第几个节点?\n"); 124             scanf("%d",&n); 125  DlistDelete(head,n); 126             printf("当前链表:\n"); 127  print(head); 128             break; 129         case 4: 130             if(head==NULL){ 131                 printf("请先创建双链表!\n"); 132                 break; 133  } 134             printf("当前链表:\n"); 135  print(head); 136             break; 137         default: 138             exit(1); 139  } 140     system("pause"); 141     system("cls"); 142     return head; 143 } 144 int main() 145 { 146     DLinkedList head = NULL; 147     while(1){ 148         int in; 149         in = menu(); 150         head = work(head,in); 151  } 152     return 0; 153 }

 

 1 /* 程序8  2 设有一个双链表,每个结点中除有prior,next及data〔可设为正整数〕三个域之外,还有一个专门记录访问该结点次数的数据域freq,其值在初始化时为零。  3 每当在链表中进行一次Search〔l,key〕时,则数据域data之值等于key的结点,其freq域之值将加一。  4 并使该双链表中结点按freq之值的递减顺序排列,freq值越大的结点越靠近表头。  5 请编写符合上述要求的Search〔l,key〕程序。  6 设计要求:在程序中构造三个子程序分别为  7 DLinkedList Creat() //建立链表  8 void Search(DLinkedList head,int key) //查找链表中符合要求的结点  9 void print(DLinkedList head); //输出链表中的结点  10 */

 11 

 12 #include <stdio.h>

 13 #include <malloc.h>

 14 #include <stdlib.h>

 15 typedef struct LNode{  16     int data;  17     int freq;    //访问次数

 18     LNode* prior;  19     LNode* next;  20 } LNode,*DLinkedList;  21 

 22 DLinkedList creat()  23 {  24     DLinkedList head = (LNode*)malloc(sizeof(LNode)),p = head;  25     head->data = 0;  26     head->next = NULL;  27     head->prior = NULL;  28     head->freq = 0;  29     printf("请输入链表大小:(最多1000个)\n");  30     int n,i,e;  31     scanf("%d",&n);  32     if(n<=0 || n>1000){  33         printf("请输入正确的链表大小!\n");  34         head = NULL;  35         return head;  36  }  37     printf("请输入循环链表的所有元素:\n");  38     for(i=1;i<=n;i++){    //输入元素

 39         scanf("%d",&e);  40         DLinkedList t = (LNode*)malloc(sizeof(LNode));    //创建节点

 41         t->data = e;  42         t->next = NULL;  43         t->prior = p;  44         t->freq = 0;  45         p->next = t;  46         p = p->next;  47  }  48     return head;  49 }  50 void Search(DLinkedList head,int key)    //查找链表中符合要求的结点

 51 {  52     DLinkedList p = head->next;  53     head = head->next;  54     while(head){    //找到符合要求的节点

 55         if(head->data == key){  56             head->freq++;  57             break;  58  }  59         head = head->next;  60  }  61     while(p){  62         if(head->freq >= p->freq){  63             int t;  64             t = head->data;head->data = p->data;p->data = t;  65             t = head->freq;head->freq = p->freq;p->freq = t;  66             break;  67  }  68         p = p->next;  69  }  70 }  71 

 72 void print(DLinkedList L)                  //输出链表中的结点

 73 {  74     DLinkedList p = L->next;  75     L = L->next;  76     while(L){  77         printf("%d ",L->data);    //输出剩下的元素

 78         L = L->next;  79  }  80     printf("\n");  81     while(p){  82         printf("%d ",p->freq);    //输出剩下的元素

 83         p = p->next;  84  }  85     printf("\n");  86 }  87 int menu()  88 {  89     int in;  90     printf("[1] 创建双链表\n");  91     printf("[2] 查找链表中符合要求的节点\n");  92     printf("[3] 输出链表\n");  93     printf("[0] 按任意键退出\n");  94     scanf("%d",&in);  95     return in;  96 }  97 DLinkedList work(DLinkedList head ,int in)  98 {  99     switch(in){ 100         case 1: 101             head = creat(); 102             break; 103         case 2: 104             if(head==NULL){ 105                 printf("请先创建双链表!\n"); 106                 break; 107  } 108             int key; 109             printf("请问你要查找的关键值(key)是?\n"); 110             scanf("%d",&key); 111  Search(head,key); 112             printf("查找结果:\n"); 113  print(head); 114             break; 115         case 3: 116             if(head==NULL){ 117                 printf("请先创建双链表!\n"); 118                 break; 119  } 120             printf("当前链表:\n"); 121  print(head); 122             break; 123         default: 124             exit(1); 125  } 126     system("pause"); 127     system("cls"); 128     return head; 129 } 130 int main() 131 { 132     DLinkedList head = NULL; 133     while(1){ 134         int in; 135         in = menu(); 136         head = work(head,in); 137  } 138     return 0; 139 }

 

Freecode : www.cnblogs.com/yym2013

你可能感兴趣的:(数据结构)