课设2--线性表的操作

Posted zongyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课设2--线性表的操作相关的知识,希望对你有一定的参考价值。

  1 #include "stdio.h"
  2 #include "malloc.h"
  3 #define datatype int
  4 typedef struct node
  5 { 
  6     datatype data;        //链表的数据域
  7     struct node *next;    //链表的指针域
  8 } LNode,*LinkList;
  9 
 10 LinkList Creat_LinkList1( ) //头插入法建立单链表算法
 11 {
 12     int i;  
 13     int x;
 14     int n;
 15     LNode *L;  
 16     L=(LNode *)malloc(sizeof(LNode));  
 17     L->next = NULL;
 18     printf("输入单链表的长度(头插法):");  
 19     scanf("%d",&n);
 20     printf("输入元素:");
 21     for(i=0;i<n;i++)  
 22     {  
 23         LNode *p;  
 24         p=(LNode *)malloc(sizeof(LNode));  
 25         scanf("%d",&x);  
 26         p->data = x;  
 27         p->next = L->next;  
 28         L->next = p;  
 29     }  
 30     return L;  
 31 }
 32 /*按序号查找 Get_Linklist(L,i)
 33 在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
 34 LNode *Get_LinkList(LinkList L,int i)
 35 {  
 36     LNode *p;
 37     int j;
 38     if(L->next==NULL)
 39         return NULL;
 40         if(i<1)
 41             return NULL;
 42         j=0;
 43         p=L;
 44     while(p->next!=NULL&&j<i)
 45     {
 46         p=p->next;
 47         j++;
 48     }
 49     if(j==i)
 50         return p;
 51     else
 52         return NULL;
 53 }
 54 /*插入运算 Insert_LinkList(L,i,x)
 55 在单链表L的第i个位置上插入值为x的元素*/
 56 int  Insert_LinkList(LinkList  L, int i, datatype  x)     
 57 {
 58     LinkList p;
 59     LNode *s;
 60     int j;
 61     p=L;
 62     j=1;
 63     while(j<i){
 64         p=p->next;
 65         j++;
 66     }
 67     s=(LNode*)malloc(sizeof(LNode));
 68     s->data=x;
 69     s->next=p->next;
 70     p->next=s;
 71     return 1;
 72 }
 73 /*删除运算:Del_LinkList(L,i)
 74 删除单链表L上的第i个数据结点*/
 75 int  Del_LinkList(LinkList  L,int i)   
 76 {    
 77     int j;  
 78      LinkList p,q;  
 79      p=L;  
 80      j=1;  
 81      while(j<i)  
 82      {  
 83          p=p->next;  
 84          j++;  
 85      }  
 86      q=p->next;  
 87      p->next = p->next->next;  
 88      free(q);
 89      return 1;
 90 }
 91 void print(LinkList L)           //输出单链表
 92 {   LNode *p=L;
 93     p=L->next;
 94     while(p->next!=NULL)
 95     { printf("%d->",p->data);    //输出表中非最后一个元素
 96       p=p->next; 
 97     }
 98     printf("%d
",p->data);      //输出表中最后一个元素    
 99 }
100 void linkcount(LinkList L)
101 {
102     struct a{
103         int x;
104         int y;
105     }a[100];
106     int m=0;
107     LinkList p,q;
108     p=(LinkList)malloc(sizeof(LNode));
109     q=(LinkList)malloc(sizeof(LNode));
110     while(L->next){
111         a[m].x=L->next->data;
112         a[m].y=1;
113         p=L->next;
114         while(p->next)
115         {
116             if(L->next->data==p->next->data)
117             {
118                 p->next=p->next->next;
119                 a[m].y++;
120             }
121             else
122             {
123                 p=p->next;
124             }
125         } 
126         m++;
127         L=L->next;
128     }
129     printf("该链表中
");
130     for(int i=0;i<m;i++){
131         printf("%d出现%d次
",a[i].x,a[i].y);
132     }
133 } 
134 
135 void main()
136 { 
137     LinkList  H;
138     int i,j,k;
139     datatype x;
140     do
141     {  
142     printf("



");
143     printf("			 链表子系统
");
144     printf("		*******************************
");
145     printf("		*        1----建    表     *
");
146     printf("		*        2----插    入    *
");
147     printf("		*        3----删  除    *
");
148     printf("		*        4----查  找    *
");
149     printf("		*        5----显  示    *
");
150     printf("		*        6----计    数    *
");
151     printf("		*        0----返  回    *
");
152     printf("		*******************************
");
153     printf("		 请选择菜单项(0-5):");
154     scanf("%d",&k);getchar();
155     if (k==1)
156         H=Creat_LinkList1( );      //用头插入法建立单链表
157     else if (k==2)       //在线性表第i位置处插入值为X的元素
158     {
159         printf("
   请输入插入的位置i和数据X(输入格式:i,X):");
160         scanf("%d,%d",&i,&x);
161         j=Insert_LinkList(H,i,x);
162     }
163     else if (k==3)
164     {    printf("
   请输入要删除元素的位置i:");
165         scanf("%d",&i);
166         j=Del_LinkList(H,i);
167         if (j == 1) printf("删除成功!!");
168         else printf("删除失败!!");        
169     }
170     else if(k==4)       //查找线性表中元素值为x的位置
171     {    
172         LNode *p;
173         printf("
   请输入要查找的序号i:");
174         scanf("%d",&i);
175         p=Get_LinkList(H,i);
176         if (p!=NULL)
177         { print(H);printf("中序号为i的地址是 %d ",p);}
178         else
179         printf("链表中无此序号!!
");
180     }
181      else if (k==5)        //输出链表
182      {    printf("
表的存储顺序为:");
183         print(H);  
184     }
185     else if (k==6)        //
186      {    printf("
计数:");
187         linkcount(H);  
188     }
189     }while(k!=0);
190 }

部分运行结果:

技术分享图片

 

以上是关于课设2--线性表的操作的主要内容,如果未能解决你的问题,请参考以下文章

课设心得

数据结构与算法线性表的重要基本操作与代码实现C语言版

第一次课设感受

线性表的插入和删除操作代码(C语言)

线性表的创建,删除插入等操作

(王道408考研数据结构)第二章线性表-第三节2:双链表的定义及其操作(插入和删除)