数据结构的作业,暂时先把代码放着,有时间再写注释,嗯,有时间再说,感觉养成了不好的习惯。。。。。。。。代码中有好多不合理的地方,希望有心人士能够指出来,毕竟我还只是一个半吊子的码农。
顺序表
基本操作
定义线性表
typedef struct{
listdata data[maxsize-1];
int len;
}seqlist;
建立空表
seqlist SETNULL(){
seqlist l;
l.len = 0;
return l;
}
求表长度
int Length(seqlist l){
printf("该表的长度为:%d\n",l.len);
return l.len;
}
按序号取出元素
listdata Get(seqlist l,int n){
//判断是否超出表的范围
if(n <= 0||n > l.len){
printf("该位置超出列表长度\n");
return 0;
}
else{
printf("第%d个元素是:%d\n",n,l.data[n-1]);
return l.data[n-1];
}
}
按值查询
int Locate(seqlist l,listdata x){
int i,k=1;
//判断是否存在,存在返回所在位置,否则返回0
for(i = 0;i <= l.len-1;i++)
if(x==l.data[i]){
printf("%d第一次出现在第%d个位置上。\n",x,i+1);
return i+1;
k=0;
}
if(k!=0)
printf("该值不存在\n");
return 0;
}
将新结点x插入到顺序表的第i个位置上
int insert(seqlist *l,int n,listdata x)
{int j;
if (l->len >= maxsize-1) //判断表空间是否溢出?
{printf("表空间已满或溢出\n"); return 0;}
else
if((n < 1)||(n > l->len+1)) //判断插入位置合法否?
{printf("表中该位置不存在\n"); return 0;}
else{
for(j = l->len-1;j >= n-1;j--) //批量移动
l->data[j+1] = l->data[j]; //后移一个位置
l->data[n-1] = x; //在第i个位置上插入x,所对应的下标为n-1
l->len++;
}
return 1;
}
从顺序表l中删除第i个位置上的结点
int delete(seqlist *l ,int n)
{int j;
if((n < 1)||(n > l->len)) //判断删除位置n是否合法?
{printf("表中该位置不存在\n"); return 0;}//非法位置返回0
else
{for(j = n;j <= l->len;j++) //从第n+1至len-1
l->data[j-1] = l->data[j];//顺序前移一个位置
l->len--; //表长减1
}
return 1;
}
给空表赋值
seqlist giveValue(seqlist l){
int i=0,j=1;
printf("请输入该表的整数值,回车后按Ctrl+Z结束输入:\n");
while(scanf("%d",&i) != EOF)//存储顺序表的元素
{ printf("第%d个数是:%d\n",j,i);
l.data[l.len] = i;
l.len++;
j++;
}
printf("输入完毕!!!\n");
return l;
}
检查A是不是B的子集
bool Check01(seqlist A, seqlist B){//检查A是不是B的子集
int i,k;
bool f=true;
for(i=0;i<=A.len-1;i++){ //从第一个遍历到最后一个
if(f){ //如果前一个值是,则判断下一个值,否则结束
for(k=0;k<=B.len-1;k++){
if(A.data[i]==B.data[k]){
f=true;
break;
}
else
f=false;
}
}
else
return f;
}
return f;
}
合并两个子序列
seqlist packList(seqlist A,seqlist B){//合并两个子序列
seqlist C=B;
printf("C表的长度为%d\n",C.len);
int i,low=0,high,mid,k=0,n;
for(i=0;i<=A.len-1;i++){ //对A的每个子元素进行遍历
high = C.len-1;
mid=ceil((low+high)/2.0);
while(low<high&&C.data[mid] != A.data[i]){ //如果C的中间值不等于A中元素值
if(A.data[i]>C.data[mid]){ //A的元素值大于C的中间值
if(A.data[i]>=C.data[high]){//并且大于C中的最大值
k = C.len+1;
break;
}
else{
if(low == mid){ //如果low和mid相等,则返回
k = mid + 1;
break;
}
else{//如果low和mid不相等,则继续向右查找
low = mid;
}
}
}
else if(A.data[i]<C.data[mid]){ // A的元素值小于C的中间值
if(A.data[i]<=C.data[low]){ //并且小于C中的最小值
k = low+1;
break;
}
else
if(mid == high){//如果lhigh和mid相等,则返回
k = high+1;
break;
}
else{ //如果high和mid不相等,则继续向左查找
high = mid;
}
}
//承接上面的if,没有出现过这种情况 ,这句代码相当于多余的。
else
k = mid+1;
mid=ceil((low+high)/2.0);
}
//执行完循环,如果C的中间值等于A的元素,则把A元素放到C中间值的位置上
if(A.data[i]==C.data[mid])
k = mid+1;
//用n来接受是否成功插入元素
n = insert(&C,k,A.data[i]);
}
return C;
}
链式表
基本操作
定义链表
typedef struct node{ //定义链表
datatype data;
struct node *next;
}linklist;
头插法创建链表
linklist* Create(void){
//建立两个链表,一个用于存放数据,一个存放另一个链表的地址
linklist *l,*head;
datatype ch;
//首先建立空指针
head = NULL;
printf("请输入链表的值,以$结束\n");
ch = getchar();
while(ch != '\n'){
// 建立一个空表大约有5字节空间(字符数据占1字节,指针占4字节),分配空间
l = (linklist *)malloc(sizeof(linklist));
//向空间中存字符数据
l->data = ch;
//向链表存放上一个节点的地址。
l->next = head;
//存取当前链表地址
head = l;
printf("%c",l->data);
ch = getchar();
}
return head;
}
尾插法创建链表
linklist* Creatlistr(void){
datatype ch;
linklist *head,*l,*r;
//建立一个表头
head = (linklist*)malloc(sizeof(linklist));
//建立一个指向下一节点的指针
r = head;
printf("请输入链表的值\n");
ch = getchar();
while(ch !='\n'){
//创建节点,分配空间
l = (linklist*)malloc(sizeof(linklist));
//节点赋值
l->data = ch;
//将l节点加入到链表的下一个
r->next = l;
//最后一个指向l节点
r = l;
//printf("%c\n",l->data);
//获取下一节点的值
ch = getchar();
}
r->next = NULL;
return head->next;
}
求链表中有多少个节点
void Length(linklist *l){
int j = 0;
linklist *p;
p = l;
//链表有一个头指针,当链表是空的时候到达尾部
while(p != NULL){
p = p->next;
j++;
}
printf("现在链表长度是%d\n",j);
}
找前趋节点
linklist* get(linklist *l,int i){
if(i ==0)
i = 1;
linklist *p;
p = l;
int j = 1;
while((p != NULL)&&(j<i)){
p = p->next;
j++;
}
if(j == i){
return p;
}
else
return NULL;
}
按序号取元素
datatype Get(linklist *l,int i){
int j = 1;
linklist *p;
p = (linklist*)malloc(sizeof(linklist));
p = l;
while((p->next != NULL)&&(j<i)){
p = p->next;
j++;
}
//如果存在返回值
if(i == j)
return p->data;
else
return '$';
}
按值查询
int Locate(linklist *l,datatype ch){
int i = 1;
linklist *p;
p = (linklist*)malloc(sizeof(linklist));
p = l;
while(p!=NULL){
if(p->data == ch)
return i;
p = p->next;
i++;
}
//如果存在返回节点的值
if(p->data == ch)
return i;
else
return 0;
}
后插操作
int insertafter(linklist *l,int i,datatype x){
//把要插入的值给新节点
linklist *s,*p;
//获得第i个节点的地址
p = get(l,i+1);
//给新节点分配空间,返回空间地址
s = (linklist*)malloc(sizeof(linklist));
if(p != NULL){
s->data = x;
//将新节点链接到第i后面的节点中
s->next = l->next;
//将前面的节点到新节点的节点连接
l->next = s;
return 1;
}
else
return 0;
}
前插操作
int insertbefore(linklist *l,int i,datatype x){
linklist *s,*p;
//给新节点分配空间,返回空间地址
s = (linklist*)malloc(sizeof(linklist));
//获得第i个节点的前趋节点
p = get(l,i);
if(p != NULL){
//将第i个节点数据给新节点
s->data = p->data;
//将新节点与第i后面的节点相连
s->next = p->next;
//将第i个节点赋值为新值
p->data = x;
//链接新节点
p->next = s;
return 1;
}
else
return 0;
}
删除第i个节点
int Delete(linklist *l,int i){
//找到第i个节点
linklist *p,*s;
// if(i==1)
// p = get(l,i);
// else
p = get(l,i-1);
if(p!=NULL){
s = p->next;
p->next = p->next->next;
free(s);
return 1;
}
else
return 0;
}
输出链表
void display(linklist *l){
linklist *p;
int i = 1;
p = l;
while(p){
printf("第%d个节点元素是%c\n",i,p->data);
i++;
p = p->next;
}
}
栈
基本操作
定义栈
typedef struct
{ datatype data[MAXSIZE];
int top;
}seqstack;
初始化操作,设置空栈
int InitStack(seqstack *s){
s->top = 0;
return 1;
}
判断空栈操作,返回0是空,1是非空
int EmptyStack(seqstack *s){
if(s->top>0)
return 1;
else
return 0;
}
入栈操作
int Push(seqstack *s,datatype x){
if(s->top>=MAXSIZE){
printf("OVERFLOE\n");
return 0;
}
else{
s->data[s->top] = x;
s->top++;
return 1;
}
}
出栈操作
int Pop(seqstack *s,datatype *d){
if(EmptyStack(s)){
s->top--;
*d = s->data[s->top];
return 1;
}
else{
printf("EMPTY\n");
return 0;
}
}
取栈顶元素操作
int GetTop(seqstack *s,datatype *d){
if(EmptyStack(s)){
s->top--;
*d = s->data[s->top];
return 1;
}
else{
printf("This stack is Empty");
return 0;
}
}
置栈空操作
int ClearStack(seqstack *s){
if(EmptyStack(s)){
printf("This is not Empty,do you want clear\n");
printf("Y or N\n");
//getchar();
int order;
while((order=getchar())!= EOF){
if(order='Y'){
InitStack(s);
return 1;
}
else
return 0;
}
}
else{
printf("This is Empty\n");
return 1;
}
}
求当前栈中元素的个数
int CurrentSize(seqstack *s){
return s->top;
}
链表栈
基本操作
定义节点
typedef struct node{
datatype data;
struct node *next;
}linkstack;
初始化操作
void InitStack(linkstack *top){
top->next = NULL;
printf("栈初始化成功\n");
}
判空操作
int EmptyStack(linkstack *top){
if(top == NULL){
printf("this stack is empty\n");
return 0;
}
else{
printf("this stack is not empty\n");
return 1;
}
}
入栈操作
int Push(linkstack *top,datatype ch_in,linkstack *node_in){
if(node_in != NULL){
node_in->data = ch_in;
node_in->next = top->next;
top->next = node_in;
printf("%c入栈成功\n",ch_in);
return 1;
}
else{
printf("入栈失败\n");
return 0;
}
}
出栈操作
int Pop(linkstack *top){
datatype ch_out;
if(EmptyStack(top)){
ch_out = top->next->data;
top->next = top->next->next;
printf("出栈成功,出栈元素为%c\n",ch_out);
return 1;
}
else
{
printf("出栈失败\n");
return 0;
}
}
取栈顶元素
int GetTop(linkstack *top){
datatype ch_btn;
if(EmptyStack(top)){
ch_top = top->next->data;
printf("取栈顶元素成功,栈顶元素为%c\n",ch_top);
return 1;
}
else
{
printf("没有栈顶元素\n");
return 0;
}
}
置栈空操作
int ClearStack(linkstack *top){
if(top != NULL){
char ch;
printf("this stack is not empty,dou you want to clear?(Y or N)\n");
while(scanf("%c",&ch) != EOF){
if(ch == 'Y'){
top->next = NULL;
printf("this stack is empty\n");
return 1;
}
else if(ch == 'N'){
printf("栈置空失败\n");
return 0;
}
else{
printf("输入格式错误\n");
}
}
}
else{
printf("this stack is empty\n");
return 1;
}
}
求当前栈中元素的个数
int CurrentSize(linkstack *top){
int len = 0;
linkstack *down = (linkstack *)malloc(sizeof(linkstack));
down = top;
while(down->next != NULL){
len++;
down->next = down->next->next;
}
return len;
}
两个栈共享一个空间
基本操作
定义
datatype v[M];
int ta,tb;
int flag = 0; //入a栈flag=0,入b栈flag=1
初始化栈
void InitStack(){
ta = -1;
tb = M;
}
判栈空
int EmptyStack(datatype *v){
if(((tb-ta)>=0)&&((tb-ta)<=M)){
printf("非空\n");
return 1;
}
else{
printf("空栈\n");
return 0;
}
}
入栈操作
int Push(datatype *v,datatype data_in){
if((tb-ta>1)){
if(flag){
tb--;
v[tb] = data_in;
printf("%c入B栈成功\n",data_in);
}
else{
ta++;
v[ta] = data_in;
printf("%c入A栈成功\n",data_in);
}
return 1;
}
else{
printf("OVERFLOW\n");
return 0;
}
}
出栈操作
int Pop(datatype *v,datatype *data_out){
if(EmptyStack(v)){
if(flag){
*data_out = v[tb];
tb++;
}
else{
*data_out = v[ta];
ta--;
}
return 1;
}
else{
printf("出栈失败\n");
return 0;
}
}
取栈顶元素
int GetTop(datatype *v,datatype *data_top){
if(EmptyStack(v)){
if(flag){
*data_top = v[tb];
}
else{
*data_top = v[ta];
}
return 1;
}
else{
printf("取栈顶元素失败\n");
return 0;
}
}
取栈底元素
int GetBottom(datatype *v,datatype *data_btm){
if(EmptyStack(v)){
if(flag){
*data_btm = v[M-1];
int i = M-1;
for(i;i<=tb;i--)
v[i] = v[i-1];
}
else{
*data_btm = v[0];
int i = 0;
for(i;i>=tb;i++)
v[i] = v[i+1];
}
return 1;
}
else{
printf("取栈底元素失败\n");
return 0;
}
}
循环列表
基本操作
定义列表
typedef struct{
datatype data[M];
int front,rear;
}sequeue;
置空队列
void SETNULL(sequeue *sq){
sq->front = 0;
sq->rear = 0;
printf("现在队列已经置空");
}
判空
int EMPTY(sequeue *sq){
if(sq->front == sq->rear){
printf("this squeue is Empty\n");
return 0;
}
else{
printf("this squeue is not Empty\n");
return 1;
}
}
取队列头,元素不动
int FRONT(sequeue *sq){
if(EMPTY(sq)){
printf("队列头元素为%c\n",sq->data[(sq->front%M)]);
return 1;
}
else{
printf("队列中没有元素\n");
return 0;
}
}
将元素放到队列尾部
int ENQUEUE(sequeue *sq,datatype data_in){
if(((sq->rear+1)%M) == sq->front){
printf("这个队列已经满了\n");
return 0;
}
else{
sq->data[sq->rear] = data_in;
printf("%c元素在%d位置上添加成功\n",data_in,sq->rear);
sq->rear = (sq->rear)%M+1;
return 1;
}
}
出队
int DEQUEUE(sequeue *sq){
datatype data_out;
if(EMPTY(sq)){
data_out = sq->data[sq->front%M];
printf("出队元素为%c\n",data_out);
sq->front = sq->front%M+1;
return 1;
}
else{
printf("队列中没有元素,出队失败\n");
return 0;
}
}
链表队列
基本操作
定义
typedef struct node{
datatype data;
struct node *next;
}linknode;
typedef struct{
linknode *front,*rear;
}linksqueue;
置空队列
void SETNULL(linksqueue *sq){
sq->front = (linknode *)malloc(sizeof(linknode));
sq->rear = (linknode *)malloc(sizeof(linknode));
sq->front->next = NULL;
sq->rear = sq->front;
printf("初始化成功\n");
}
判空
int EMPTY(linksqueue *sq){
if(sq->front==sq->rear){
printf("this linkqueue is Empty\n");
return 0;
}
else{
printf("this linkqueue is not Empty\n");
return 1;
}
}
取队列头,元素不动
int FRONT(linksqueue *sq){
datatype data_get;
if(EMPTY(sq)){
data_get = sq->front->next->data;
printf("获得队列头元素为%c\n",data_get);
return 1;
}
else{
printf("取队列头元素失败\n");
return 0;
}
}
将元素放到队列尾部
int ENQUEUE(linksqueue *sq,datatype data_in){
linknode *n = (linknode *)malloc(sizeof(linknode));
if(n != NULL){
n->data = data_in;
sq->rear->next = n;
sq->rear = n;
printf("%c元素入队成功\n",data_in);
return 1;
}
else{
printf("OVERFLOW\n");
return 0;
}
}
出队
int DEQUEUE(linksqueue *sq){
linknode *n = (linknode *)malloc(sizeof(linknode));
if(EMPTY(sq)){
n = sq->front->next;
printf("出队元素%c\n",n->data);
sq->front->next = sq->front->next->next;
return 1;
}
else{
printf("出队失败\n");
return 0;
}
}