前言
数据结构老师布置了第一次程序设计作业,为照顾班级大多同学,所以作业也很简单,糊弄糊弄20分钟搞出来了
概述
功能:
1、建立一个链表
2、插入操作分为三种:在头结点后插入、在尾节点后插入、在第k个节点后插入
3、可以查找字母
4、可以删除字母并删除第k个节点后的字母
5、可以打印输出链表
原本想用c写的,但是
因为有很多输入输出要写,所以用了cin
cout
,就改C++了,请用.cpp
的方式打开
程序有很多可优化的地方,请自行优化嘻嘻
函数名和变量名称起的一坨屎,别介意,比如说eleType
就用了没两次,这玩意应该全局用的,懒得打字了,哈哈哈哈
以下废话
主要是交流学习、记录自己短短的大学时光,现在时间过的太快了,如果说今天周五,明后天放假,很快昂,周一就来了,
周一刚来,顺着顺着很快就周四了,都感觉不出来,一到周四,周五也很快来了....
唉~~~而自己,还是个小废物
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <iostream>
using namespace std;
#define eleType char
typedef struct Link {
eleType val;
struct Link *next;
} Link;
void print ( Link *L );
Link* makeLink ( Link *f );
int add_k ( Link *h, int k, char ch );
int add_head ( Link *h, char ch );
int add_end ( Link *h, Link *f, char ch );
int del_ch ( Link *h, char ch );
int del_k ( Link *h, int k );
void del_all ( Link *h );
int find ( Link *h, char ch );
void print ( Link *L )
{
Link *T = L->next;
cout << "***************" << endl;
while ( T != NULL && T != L )
{
cout << T->val << ' ';
T = T->next;
}
cout << endl << "***************" << endl;
}
int add_k ( Link *h, int k, char ch )
{
int cnt = 0;
while ( h != NULL )
{
if ( cnt == k )
{
Link *T;
T = (Link*) malloc ( sizeof ( Link ) );
if ( T == NULL ) return 0;
T->val = ch;
T->next = h->next;
h->next = T;
return 1;
}
cnt++;
h = h->next;
}
return 0;
}
int add_head ( Link *h, char ch )
{
Link *T;
T = (Link*) malloc ( sizeof ( Link ) );
if ( T == NULL ) return 0;
T->val = ch;
T->next = h->next;
h->next = T;
return 1;
}
int add_end ( Link *h, Link **f, char ch )
{
Link *T;
T = (Link*) malloc ( sizeof ( Link ) );
if ( T == NULL ) return 0;
T->val = ch;
T->next = NULL;
( *f )->next = T;
( *f ) = T;
return 1;
}
int del_k ( Link *h, int k )
{
int cnt = 0;
while ( h )
{
if ( cnt == k )
{
Link *T = h->next;
h->next = h->next->next;
free ( T );
return 1;
}
cnt++;
h = h->next;
}
return 0;
}
// 这里糊弄一下了
void del_all ( Link *h )
{
h->next = NULL;
}
Link* makeLink ( Link **f )
{
Link *T = (Link*) malloc ( sizeof ( Link ) );
if ( T == NULL ) exit ( -1 );
*f = T;
T->next = NULL;
return T;
}
int find ( Link *h, char ch )
{
int cnt = 0;
while ( h )
{
if ( h->val == ch )
{
return cnt;
}
cnt++;
h = h->next;
}
return -1;
}
int del_ch ( Link *h, char ch )
{
int cnt = 0;
while ( h )
{
if ( h->val == ch )
{
Link *T = h->next;
h->next = h->next->next;
free ( T );
return 1;
}
cnt++;
h = h->next;
}
return -1;
}
// main 函数很脏很烂,仅供测试,主功能型函数复杂度很高,暴力算法
int main ( void )
{
Link *h, *f = NULL;
h = makeLink ( &f );
while ( 1 )
{
cout << "请输入您要进行的操作:
1、头插 2、尾插 3、在第k个数据后插入 4、删除 5、查找字母 6、打印链表 7、退出" << endl;
int op;
cin >> op;
switch ( op )
{
case 1:
{
cout << "请输入要插入的字符:" << endl;
char ch;
cin >> ch;
if ( add_head ( h, ch ) ) cout << "YES!" << endl;
else cout << "ERROR!!" << endl;
break;
}
case 2:
{
cout << "请输入要插入的字符:" << endl;
char ch;
cin >> ch;
if ( add_end ( h, &f, ch ) ) cout << "YES!!" << endl;
else cout << "ERROR!!" << endl;
break;
}
case 3:
{
cout << "在第几个数据后插入?:";
int k;
cin >> k;
cout << "请输入要插入的字符:" << endl;
char ch;
cin >> ch;
if ( add_k ( h, k, ch ) ) cout << "YES!!" << endl;
else cout << "ERROR!!" << endl;
break;
}
case 4:
{
cout << "1、删除全部 2、删除第k个后面的数据 3、删除第一个包含字符ch的数据" << endl;
int n;
cin >> n;
if ( n == 1 )
{
del_all ( h );
} else if ( n == 2 ) {
cout << "请输入k值:" << endl;
int k;
cin >> k;
if ( del_k ( h, k ) ) cout << "YES!!" << endl;
else cout << "ERROR!!" << endl;
} else if ( n == 3 ) {
cout << "请输入要删除的字符:";
char ch;
cin >> ch;
if ( del_ch ( h, ch ) ) cout << "YES!!" << endl;
else cout << "ERROR!!" << endl;
}
break;
}
case 5:
{
cout << "请输入要查找的字母" << endl;
char ch;
cin >> ch;
int k = find ( h, ch );
if ( k == -1 ) cout << "未找到" << endl;
else cout << ch << " 在第" << k << "个元素" << endl;
break;
}
case 6:
{
print ( h );
break;
}
case 7: exit ( 1 );
}
}
return 0;
}
欢迎点赞评论留言交流哦~溜了