堆栈操作合法性
#include<stdio.h>
int main()
{
//输入栈容量和操作数,用length表示栈内现有元素个数
int Ssize, oper, counter, length = 0,flag = 0;
scanf("%d %d ",&oper, &Ssize);
for(counter = 0; counter < oper; counter ++) {
char chr;
//s入栈,length加一,x出栈,length减一
while((chr = getchar()) != '\n') {
if(chr == 'S') {
length++;
if(length > Ssize)
flag = 1;
}
if(chr == 'X') {
length--;
if(length < 0)
flag = 1;
}
}
if(length == 0 && flag == 0)
printf("YES\n");
else
printf("NO\n");
length = 0;
flag = 0;
}
return 0;
}
求链式线性表的倒数第K项
#include<stdio.h>
#include<malloc.h>
struct Node{
int data;
struct Node *next;
};
int main()
{
int k,t,i;
scanf("%d",&k);
struct Node *head,*p;
head=(struct Node *)malloc(sizeof(struct Node));
head->next=NULL;
while(scanf("%d",&t)&&t>=0)
{
p=(struct Node *)malloc(sizeof(struct Node));
p->data=t;
p->next=head->next;
head->next=p;
}
for(i=0;i<k;i++)
head=head->next;
if(head) printf("%d",head->data);
else printf("NULL");
}
————————————————
两个有序链表序列的交集
//库函数头文件包含
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
//打印链表中的数据
void ListPrint_L(LinkList &L)
{
if (L->next == NULL)
{
printf("NULL");
return;
}
//输出单链表
LNode *p = L->next; // p指向第一个元素结点
while (p != NULL)
{
if (p->next != NULL)
printf("%d ", p->data);
else
printf("%d", p->data);
p = p->next;
}
}
//为链表添加结点,需要传入直接前驱
LNode *addLNode(LinkList &L, ElemType e)
{
L->next = (LinkList)malloc(sizeof(LNode));
if (!(L->next))
{
exit(OVERFLOW);
}
L->next->data = e;
L->next->next = NULL;
return L->next;
}
Status ListCreate_L(LinkList &L)
{
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
if (!L)
{
exit(OVERFLOW);
}
LNode *p = L;
int num = 0;
while (scanf("%d", &num) != EOF)
{
if (num == -1)
{
break;
}
p = addLNode(p, num);
}
return OK;
}
LNode *LinkOrderList(LinkList &L1, LinkList &L2)
{
LNode *head = (LNode *)malloc(sizeof(LNode));
head->next = NULL;
//列表有一个为空的情况
if ((L1->next) && (L2->next))
{
LNode *s = L1, *t = L2, *p = head;
while ((s->next) && (t->next))
{
if ((s->next->data) > (t->next->data))
{
t = t->next;
}
else if ((s->next->data) < (t->next->data))
{
s = s->next;
}
else
{
p = addLNode(p, s->next->data);
s = s->next;
t = t->next;
}
}
}
return head;
}
int main()
{
LNode *L1 = (LNode *)malloc(sizeof(LNode)), *L2 = (LNode *)malloc(sizeof(LNode));
ListCreate_L(L1);
ListCreate_L(L2);
LNode *head = LinkOrderList(L1, L2);
ListPrint_L(head);
return 0;
}
两个有序链表序列的合并
//库函数头文件包含
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
Status ListCreate_L(LinkList &L)
{
L = (LNode *)malloc(sizeof(LNode));
if (!L)
{
exit(OVERFLOW);
}
L = (LNode *)malloc(sizeof(LNode));
LNode *tmp = L;
int n = 0, num = 0;
while (scanf("%d", &num) != EOF)
{
if (num == -1)
{
break;
}
tmp->next = (LNode *)malloc(sizeof(LNode));
tmp->next->data = num;
tmp = tmp->next;
n++;
}
tmp->next = NULL;
L->data = n;
return OK;
}
void ListPrint_L(LinkList &L)
{
if (L->next==NULL) {
printf("NULL");
return ;
}
//输出单链表
LNode *p = L->next; // p指向第一个元素结点
while (p != NULL)
{
if (p->next != NULL)
printf("%d ", p->data);
else
printf("%d", p->data);
p = p->next;
}
}
LNode *LinkOrderList(LinkList &L1, LinkList &L2)
{
//确定头部最小的序列
if (!(L1->next)) {
return L2;
}
if (!(L2->next)) {
return L1;
}
LinkList p = L1->next, t = L2->next;
if ((L1->next->data) > (L2->next->data))
{
p = L2->next, t = L1->next;
}
while (p->next != NULL && t != NULL)
{
if ((p->next->data) > (t->data))
{
LinkList s = p->next;
p->next = t;
t = s;
}
else
{
p = p->next;
}
}
p->next = t;
return L1;
}
int main()
{
LinkList L1, L2;
if (ListCreate_L(L1) != OK)
{
printf("表创建失败!!!\n");
return -1;
}
if (ListCreate_L(L2) != OK)
{
printf("表创建失败!!!\n");
return -1;
}
LNode *head = LinkOrderList(L1, L2);
ListPrint_L(head);
return 0;
}
————————————————
带头结点的单链表就地逆置
void ListReverse_L(LinkList &L)//L为头结点
{
LinkList p,q;
p = L->next;
L->next = NULL;
while(p)
{
//向后挪
q = p;//
p = p->next;
//头插
q->next = L->next;//非常重要,相当于p和q之间没有了指针连接
L->next = q;//把q接到头的后面
}
}
7-2 jmu-ds-顺序表区间元素删除
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
//顺序表的存储结构定义
#define LIST_INIT_SIZE 11
#define LISTINCREMENT 10
typedef int ElemType; //假设线性表中的元素均为整型
typedef struct
{
ElemType *elem; //存储空间基地址
int length; //表中元素的个数
int listsize; //表容量大小
} SqList; //顺序表类型定义
Status InitList_Sq(SqList &L)
{
//初始化L为一个空的有序顺序表
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem)
exit(OVERFLOW);
L.listsize = LIST_INIT_SIZE;
L.length = 0;
return OK;
}
Status ListInsert_Sq(SqList &L, int pos, ElemType e)
{
if (L.length == L.listsize)
{
ElemType *tmp = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
if (!tmp)
exit(OVERFLOW);
L.elem = tmp;
}
if (pos > L.length + 1 || pos < 1)
{
return ERROR;
}
for (int i = L.length; i > pos - 1; i--)
{
L.elem[i] = L.elem[i - 1];
}
L.elem[pos - 1] = e;
L.length++;
return OK;
}
Status ListDelete_Sq(SqList &L, int pos)
{
for (int i = pos - 1; i < L.length; i++)
{
L.elem[i] = L.elem[i + 1];
}
L.length--;
return OK;
}
void ListPrint_Sq(SqList L)
{
for (int i = 0; i < L.length - 1; i++)
{
printf("%d ", L.elem[i]);
}
printf("%d\n", L.elem[L.length - 1]);
}
int main()
{
SqList L;
if (InitList_Sq(L) != OK)
{
printf("InitList_Sq: 初始化失败!!!\n");
return -1;
}
int n = 0;
int tmp = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &tmp);
ListInsert_Sq(L, i, tmp);
}
ElemType min = 0, max = 0;
scanf("%d", &min);
scanf("%d", &max);
// if (min > max)
// {
// tmp = min;
// min = max;
// max = tmp;
// }
for (int i = 0; i < L.length;)
{
if (min <= L.elem[i] && L.elem[i] <= max)
{
ListDelete_Sq(L, i + 1);
}
else
{
i++;
}
}
ListPrint_Sq(L);
return 0;
}
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127593118
有序顺序表的插入
Status ListInsert_SortedSq(SqList &L, ElemType e)
{
if (L.length == L.listsize)
{
L.elem = (ElemType *)realloc(L.elem, (1 + L.length) * sizeof(ElemType));
}
int j = L.length;
for (; j > 0; j--)
{
if (e > L.elem[j - 1])
{
break;
}
else
{
L.elem[j] = L.elem[j - 1];
}
}
L.elem[j] = e;
L.length = L.length + 1;
return OK;
}
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127593105
顺序表创建和就地逆置
Status ListCreate_Sq(SqList &L) {
//初始化L为一个空的有序顺序表
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem)
exit(OVERFLOW);
L.listsize = LIST_INIT_SIZE; //顺序表的容量
L.length = 0; //顺序表的元素个数
int n = 0;
scanf("%d",&n);
for (int i=0;i<n;i++) {
scanf("%d",&(L.elem[i]));
L.length ++;
}
return OK;
}
void ListReverse_Sq(SqList &L) {
for (int i=0;i<L.length/2;i++) {
ElemType tmp = L.elem[i];
L.elem[i] = L.elem[L.length-1-i];
L.elem[L.length-1-i] = tmp;
}
}
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127593099
循环单链表区间删除
Status ListCreate_CL(LinkList &CL)
{
CL = (LinkList)malloc(sizeof(LNode));
LinkList rear = CL;
rear->next = NULL;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
LNode *t = (LNode*)malloc(sizeof(LNode));
scanf("%d",&t->data);
t->next = rear->next;
rear->next=t;
}
rear->next = CL;
return OK;
}
void ListDelete_CL(LinkList &CL,ElemType min,ElemType max)
{
LNode *p = CL;
LNode *q;
while(p->next !=CL)
{
q=p->next;
if(p->data>min&&p->data<max)
{
p-next = q-next;
free(q);
}
else
p=p->next;
}
}
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127593030
顺序表基本操作
Status ListInsert_Sq(SqList &L, int pos, ElemType e)
{
if (L.length == L.listsize)
{
ElemType *tmp = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
if (!tmp)
exit(OVERFLOW);
L.elem = tmp;
}
if (pos > L.length + 1 || pos < 1)
{
return ERROR;
}
for (int i = L.length; i > pos - 1; i--)
{
L.elem[i] = L.elem[i - 1];
}
L.elem[pos - 1] = e;
L.length++;
return OK;
}
void ListPrint_Sq(SqList L)
{
for (int i = 0; i < L.length - 1; i++)
{
printf("%d ", L.elem[i]);
}
printf("%d\n", L.elem[L.length - 1]);
}
Status ListDelete_Sq(SqList &L, int pos, ElemType &e)
{
e = L.elem[pos - 1];
for (int i = pos - 1; i < L.length; i++)
{
L.elem[i] = L.elem[i + 1];
}
L.length--;
return OK;
}
int ListLocate_Sq(SqList L, ElemType e)
{
for (int i = 0; i < L.length; i++)
{
if (L.elem[i] == e)
{
return i + 1;
}
}
return 0;
}
————————————————
版权声明:本文为CSDN博主「Treasuredd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Treasuredd/article/details/127592982