1、顺序表的就地逆置
编写一个函数,实现顺序表的就地逆置,也就是说利用原表的存储空间将顺序表(a1,a2...an)逆置为(an,an-1...a2,a1)。
#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; //线性表的动态顺序存储结构 typedef int DataType; /*数据类型*/ typedef int ElemType; /*元素类型*/ #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef struct { ElemType *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储容量 }SqList; void InitList(SqList *L) //初始化 { L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//分配空间 L->length = 0; //空表的长度为0 L->listsize = LIST_INIT_SIZE; //初始容量 } void CreateList(SqList *L) { InitList(L); int i; for(i = 0; ; i ++) { scanf("%d", &L->elem[i]); if(L->elem[i]==-1) break; L->length++; } } void InsertList(SqList *L, int e) { int i; for(i = L->length-1; L->elem[i] > e; i--) //从顺序表最后一位开始,将所有大于e的元素向后移动 { L->elem[i+1] = L->elem[i]; } L->elem[i] = e; L->length++; } void ReverseList(SqList *L) { int i, temp; int n = L->length; for(i = 0; i < n/2; i ++) { temp = L->elem[i]; L->elem[i] = L->elem[n-1-i]; L->elem[n-1-i] = temp; } } void ListTraverse(SqList *L) { int n = L->length, i; for(i = 0; i < n-1; i++) printf("%d ", L->elem[i]); printf("%d ",L->elem[n-1]); } int main() { SqList L; CreateList(&L); ReverseList(&L); ListTraverse(&L); return 0; }
2、删除线性表中多余的元素
#include <iostream> #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 using namespace std; //采用的是线性表,单链表作为存储结构,在每一次的 //比较是否与之前的元素是否相等,遍历一次链表时间复杂度O(n) typedef int ElemType; typedef int Status; typedef struct Node { ElemType data; struct Node * next; }Node,*LinkList; //单链表的初始化 Status InitLinkList(LinkList * L) { (*L)=(LinkList)malloc(sizeof(Node)); if((*L)==NULL) { //printf("内存分配失败! "); return 0; } (*L)->next=NULL; return OK; } //单链表的建立 Status Create(LinkList * L,int n) { LinkList P,Q; ElemType Elem; Q=(*L); //printf("请按递增顺序输入元素: "); for(int i=0;i<n;i++) { P=(LinkList)malloc(sizeof(Node)); scanf("%d",&Elem); P->data=Elem; Q->next=P; Q=P; } P->next=NULL; return OK; } //删除结点 Status Delete(LinkList * L,int Location) { LinkList Q,P; int count=0; int k=Location+1; Q=(*L); P=(*L)->next; while(P->next) { Q=Q->next; P=P->next; count++; if(count==Location) { Q->next=P->next; } } return OK; } //定位删除结点的位置并删除 Status Locate(LinkList * L) { LinkList First,Second; int count=1; First=(*L)->next; Second=(*L)->next->next; while(Second) { if(First->data==Second->data) { Delete(L,count); Second=Second->next; } else { count++; First=First->next; Second=Second->next; } } return OK; } void Print(LinkList * L) { LinkList P; P=(*L)->next; while(P) { printf("%d ",P->data); P=P->next; } printf(" "); } int main() { LinkList L; int Number; InitLinkList(&L); //printf("请输入元素个数: "); scanf("%d",&Number); Create(&L,Number); //printf("输出链表: "); //Print(&L); Locate(&L); //printf("输出去掉相同元素后链表: "); Print(&L); return 0; }
3、表达式括号匹配
#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/ ELEMTYPE * base; ELEMTYPE * top; int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/ s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE))); if (!s->base) return ERROR; s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/ if (s->top==s->base) return OK; else return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/ if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/ s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE))); if (!s->base) return ERROR; s->stacksize+=STACK_GROW_SIZE; s->top=s->base+s->stacksize; } *s->top++=e; return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/ if (StackEmpty(s)) return ERROR; *e=*(--s->top); return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) { if ((a=='('&&b!=')') ||(a=='['&&b!=']') ||(a=='{'&&b!='}')) { return ERROR; } else return OK; } int Count(SpStack *s) { ELEMTYPE e[STACK_INIT_SIZE*2]; ELEMTYPE e1; int i; InitStack(s); fgets(e,STACK_INIT_SIZE*2,stdin); if (' '==e[strlen(e)-1]) e[strlen(e)-1]=0; //printf("%s ",e); for (i=0;e[i]!='