单链表的基本操作(查找,插入,删除)

这周老师给的作业跟上周貌似差不多。只是用了单链表。

完成单链表的基本操作函数。
1)      初始化单链表
2)      给定的数据元素存放在一维数组中,分别完成头插法和尾插法建立单链表
3)      将数据元素从键盘依次输入,分别完成头插法和尾插法建立单链表
4)      输出单链表的长度
5)      实现按位查找和按值查找
6)      实现插入和删除操作
7)      实现遍历单链表操作
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 //查找1.内容2.序号
  5 //插入
  6 //删除
  7 typedef struct student
  8 {
  9  int num;
 10  char name[10];
 11 }STU;
 12 typedef struct Node
 13 {
 14  STU data;
 15  struct Node * next;
 16 }Node;
 17 
 18 void denglu(Node *L);//登录函数
 19 void chazhao(Node *L);//查找函数
 20 void Printf(Node *L);//输出函数
 21 void CreateFromHead(Node *L);//头插法
 22 void CreateFormTail(Node *L);//尾插法
 23 void panduan(Node *L);//判断头插还是尾插
 24 void Get(Node *L);//按序号结点查找
 25 void Locate(Node *L);//按内容查找(值)
 26 void Inslist(Node *L);//插入
 27 void Dellist(Node *L);//删除
 28 
 29 void Dellist(Node *L)//删除
 30 {
 31  system("CLS");
 32  int n;
 33  printf("请输入要删除的结点\n");
 34  scanf("%d",&n);
 35  if(n<=0){
 36   printf("输入的数据不合法,请重新输入\n");
 37   Dellist(L);
 38  }
 39  Node *pre,*r;
 40  int k=0;
 41  pre=L;
 42  while(pre->next !=NULL&&k<n-1){
 43   pre=pre->next;
 44   k=k+1;
 45  }
 46  if(pre->next==NULL){
 47   printf("没有找到该结点,请重新输入\n");
 48   Dellist(L);
 49  }
 50  r=pre->next;
 51  pre->next=r->next;
 52  free(r);
 53  printf("删除成功!\n");
 54  denglu(L);
 55 }
 56 void Inslist(Node *L)//插入
 57 {
 58  system("CLS");
 59  int n;
 60  printf("请输入在第几个位置插入数据\n");
 61  scanf("%d",&n);
 62  printf("请输入插入的学号,姓名\n");
 63  int num1;
 64  char name1[10];
 65  scanf("%d %s",&num1,name1);
 66  Node *pre,*s;
 67  int k=0;
 68  if(n<=0){
 69   printf("输入的数据不合法,请重新输入\n");
 70   Inslist(L);
 71  }
 72  pre=L;
 73  while(pre!=NULL&&k<n-1){
 74   pre=pre->next;
 75   k=k+1;
 76  }
 77  if(pre==NULL){
 78   printf("无法找到该节点,请重新输入\n");
 79   Inslist(L);
 80  }
 81  s=(Node*)malloc(sizeof(Node));
 82  strcpy(s->data .name ,name1);
 83  s->data.num=num1;
 84  s->next =pre->next ;
 85  pre->next =s;
 86  printf("插入成功!\n");
 87  denglu(L);
 88 }
 89 
 90 
 91 void Locate(Node *L)//按内容查找(值)
 92 {
 93  system("CLS");
 94  int n;
 95  printf("请输入要查找的学号\n");
 96  scanf("%d",&n);
 97  Node *p;
 98  p=L->next;
 99  while(p!=NULL){
100   if(p->data.num!=n){
101    p=p->next;
102   }else
103    break;
104  }
105  printf("你要查找的学号所对应的信息为%d %s\n",p->data.num,p->data.name);
106  denglu(L);
107 }
108 void Get(Node *L)//按序号结点查找
109 {
110  system("CLS");
111  int n;
112  printf("请输入你要查找的结点\n");
113  scanf("%d",&n);
114  if(n<=0){
115   printf("输入的数据不合法,请重新输入\n");
116   Get(L);
117  }
118  Node *p;
119  p=L;
120  int j=0;
121  while((p->next!=NULL)&&(j<n)){
122   p=p->next;
123   j++;
124  }
125  if(n==j){
126   printf("你要查找的结点的储存位置的数据为%d %s\n",p->data.num,p->data.name);
127  }
128  denglu(L);
129 }
130 void Printf(Node *L)
131 {
132  int q=0;
133  Node *p=L->next;
134  while(p!=NULL)
135  {
136   q++;
137   printf("%d %s\n",p->data.num,p->data.name);
138   p=p->next;
139  }
140  printf("单链表长度为%d\n",q);
141  denglu(L);
142 }
143 void chazhao(Node *L)
144 {
145     printf("1.按序号查找\n");
146     printf("2.按内容查找\n");
147     printf("3.返回主界面\n");
148     int aa;
149     scanf("%d",&aa);
150     switch(aa){
151         case 1:Get(L);
152         case 2:Locate(L);
153         case 3:denglu(L);break;
154         default:
155                  printf("输入错误请重新输入\n");
156                  chazhao(L);   
157     }
158 }
159 
160 void denglu(Node *L)
161 {
162     int a;
163     printf("请选择你要做什么\n");
164     printf("1.查找\n");
165     printf("2.插入\n");
166     printf("3.删除\n");
167     printf("4.打印现有的学生信息及单链表长度\n");
168     printf("5.退出\n");
169     scanf("%d",&a);
170     switch(a){
171         case 1:chazhao(L);
172         case 2:Inslist(L);
173         case 3:Dellist(L);
174         case 4:Printf(L);
175         case 5:printf("谢谢使用\n");exit(0);
176         default:
177                  printf("输入错误请重新输入\n");
178                  denglu(L);   
179     }   
180 }
181 void CreateFromHead(Node *L)//头插法
182 {
183  Node *s;
184  int n;//n为元素个数
185  printf("请输入元素个数\n");
186  scanf("%d",&n);
187  printf("请输入学号姓名\n");
188  for(int i=1;i<=n;i++)
189  {
190   s=(Node *)malloc(sizeof(Node));
191   scanf("%d %s",&s->data.num,s->data.name);
192   s->next=L->next;
193   L->next=s;
194  }
195 }
196 void CreateFormTail(Node *L)//尾插法
197 {
198  Node *s,*r;
199  r=L;
200  int n;//n为元素个数
201  printf("请输入元素个数\n");
202  scanf("%d",&n);
203  printf("请输入学号姓名\n");
204  for(int i=1;i<=n;i++)
205  {
206   s=(Node *)malloc(sizeof(Node));
207   scanf("%d %s",&s->data.num,s->data.name);
208   r->next=s;
209   r=s;
210   if(i==n){
211    r->next=NULL;
212   }
213  }
214 }
215 Node *InitList(Node *L)//初始化单链表
216 {
217  L=(Node *)malloc(sizeof(Node));
218  L->next=NULL;
219  return L;
220 }
221 void panduan(Node *L)
222 {
223  int q;
224  printf("请选择用哪种方式建立链表\n");
225  printf("1.头插法\n");
226  printf("2.尾插法\n");
227  scanf("%d",&q);
228  switch(q){
229       case (1):
230     CreateFromHead(L);
231     printf("输入成功!\n");
232     break;
233    case (2):
234     CreateFormTail(L);
235     printf("输入成功!\n");
236     break;
237    default:
238     printf("输入错误请重新输入\n");
239     panduan(L);
240  }
241 }
242 
243 
244 int main()
245 {
246     Node *L=NULL;
247     L=InitList(L);
248     panduan(L);
249     denglu(L);
250    
251     return 0;
252 }

ps.贴上来的代码空格有点小奇怪啊。不用应该没什么太大影响。= =处女座强迫症伤不起 。

转载于:https://www.cnblogs.com/xzt6/p/5906320.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值