这周老师给的作业跟上周貌似差不多。只是用了单链表。
完成单链表的基本操作函数。
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.贴上来的代码空格有点小奇怪啊。不用应该没什么太大影响。= =处女座强迫症伤不起 。