数据结构实验二

发布于 2024-09-24  611 次阅读


2-1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int ElemType;   // 定义元素的类型为整型
typedef int Status;     // 定义状态类型
#define ERROR 0
#define OK 1
 
typedef struct LNode{
     ///===============补充代码======================== 
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;      // 定义节点类型以及链表类型(链表类型实际上是一个节点指针类型)
 
Status GetElem_L(LinkList &L, int i, ElemType &e) { // 算法2.8
    // L为带头结点的单链表的头指针。
    // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
   ///===============补充代码======================== 
   LinkList p = L->next;
   int j = 1;
   while(p && j < i){
		p = p->next;
		j ++;   		
   }
   if (!p || j > i) return ERROR;
   e = p->data;
   return OK;
} // GetElem_L
 
Status ListInsert_L(LinkList &L, int i, ElemType e) { // 算法2.9
    // 在带头结点的单链线性表L的第i个元素之前插入元素e   
  ///===============补充代码========================   
  LinkList p = L;
  int j = 0;
  while(p && j < i - 1){
  		p = p->next;
  		j ++;
  }
  if (!p || j > i - 1) return ERROR;
  LinkList s = (LinkList)malloc(sizeof(LNode));
  s->data = e;
  s->next = p->next;
  p->next = s;
  return OK;
} // LinstInsert_L
 
Status ListDelete_L(LinkList &L, int i, ElemType &e) { // 算法2.10
    // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
   ///===============补充代码======================== 
   LinkList p = L;
   int j = 0;
   while(p->next && j < i - 1){
   		p = p->next;
		j ++; 
   }
   if(!(p->next) || j > i - 1) return ERROR;
   LinkList q = p->next;
   e = q->data;
   p->next = q->next;
   free(q);
   return OK;
} // ListDelete_L
 
void CreateList_L(LinkList &L, int n) { // 算法2.11
    // 逆位序输入n个元素的值,建立带表头结点的单链线性表L
   ///===============补充代码======================== 
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	for (int i = n; i > 0; i --){
		LinkList p = (LinkList)malloc(sizeof(LNode));
		scanf("%d", &p->data);
		p->next = L->next;
		L->next = p;
	}
} // CreateList_L
 
int ShowList_L(LinkList L){
    // 显示链表中的元素,返回值为链表元素的数目
    ///===============补充代码======================== 
    LinkList p = L->next;
    int count = 0;
    while(p){
    	printf("%d ", p->data);
    	count ++;
    	p = p->next;
	}
    return count;
}
 
int main(){
 
    int n;                  // 初始时元素的数目
    int m;                  // 指令的数目
    char strInst[30];       // 存储指令:instruction
    int a;                  // 存储位置数据
    LinkList L;             // 链表
    int e;                  // 定义节点,用来存储获取的节点或者删除的节点
    scanf("%d", &n);        // 读入元素的数目
    CreateList_L(L, n);     // 创建链表
    scanf("%d", &m);        // 读取指令的数目
    while(m--){             // 做 m 次循环
        scanf("%s", strInst);                   // 读取指令
        if(strcmp(strInst, "get") == 0){        // 如果是需要获取某个元素
            scanf("%d", &a);                    // 读取元素的位置
            if(GetElem_L(L, a, e) == OK){       // 如果获取元素成功
                printf("%d\n", e);              // 输出元素的值
            }else{                              // 如果获取元素失败
                puts("get fail");               // 输出获取元素的出错信息
            }
        }else if(strcmp(strInst, "insert") == 0){// 如果是插入某个元素
            scanf("%d%d", &a, &e);              // 获取待插入的位置以及待插入的值
            if(ListInsert_L(L, a, e) == OK){    // 如果插入元素成功
                puts("insert OK");              // 输出插入成功的信息
            }else{
                puts("insert fail");            // 否则输出插入失败的信息
            }
        }else if(strcmp(strInst, "delete") == 0){// 如果是删除某个元素
            scanf("%d",&a);                     // 获得待删除元素的位置
            if(ListDelete_L(L, a, e) == OK){    // 如果删除成功
                puts("delete OK");              // 输出删除成功的信息
            }else{
                puts("delete fail");            // 否则输出删除失败的信息
            }
        }else if(strcmp(strInst, "show") == 0){ // 如果是显示链表
            if(ShowList_L(L) == 0){             // 如果链表为空
                puts("Link list is empty");     //显示量表为空的信息
            }
        }
    }
 
    return 0;
}

2-2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
typedef int ElemType;
typedef int Status;
#define ERROR 0
#define OK 1
using namespace std;
 
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

void CreateList_L(LinkList &L, int n) {
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	LinkList q = L;
	for (int i = n; i > 0; i --){
		LinkList p = (LinkList)malloc(sizeof(LNode));
		scanf("%d", &p->data);
		p->next = q->next;
		q->next = p;
	}
}
 
int ShowList_L(LinkList L){
    LinkList p = L->next;
    int maxx = -10000;
    while(p){
    	maxx = max(maxx, p->data); 
    	p = p->next;
	}
    return maxx;
}
 
int main(){
	LinkList L;
	int n;
	while(1){
		int maxx = 0;
		scanf("%d", &n);
		if (!n) break;
		CreateList_L(L, n);
		maxx = ShowList_L(L);
		printf("%d\n", maxx);
	}
    return 0;
}