20:C
22:B
27:D
填空
4-2:19
4-4:66
4-5:8
5-x:不加分号
⬇:top = p->next
编程
单链表
每个节点除了存放数据元素外,还要存储指向下一节点的指针
定义单链表
typedef struct{ElemType data; //数据域,每个节点存放一个数据元素struct LNode *next; //指针域,指针指向下一个节点
}LNode,*LinkList; //LNode强调返回一个节点;*LinkList强调这是一个单链表,只定义LNdoe也可以LNode *p = (LNode *)malloc(sizeof(LNode)) //在内存申请新节点,并用p指向这个节点
不带头节点的单链表&初始化
bool InitList(LinkList L){ //初始化L=NULL; //空表,防止脏数据return true;
}void test(){LinkList L; //声明一个指向单链表的指针InitList(&L);
}
带头节点
bool InitList(LinkList *L){ //初始化*L = (LNode *)malloc(sizeof(LNode)); //分配一个头节点if(L==NULL) //内存不足,分配失败return false;*L->next = NULL;return true;
}
插入删除
bool ListInsert(LinkList *L,int i , ElemType e){if(i<1) //判断是否在表头位置,头节点不存数据,存数据的节点从1开始return false;LNode *p; //当前所在节点位置int j=0; //当前p指向的是第几个节点p = L; //L指向头节点while(p!=NULL && j<i-1){ //找到第i-1个节点p = p->next; //p指向i-1个节点j++;}LNode *s = (LNode *)malloc(sizeof(LNode)); //申请内存插入数据s->data=e;s->next = p->next;p->next = s;return true;
}
堆栈
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
typedef struct{int *top; //栈顶指针int *base; //栈底指针int stacksize; //长度
}stack;//初始化堆栈
void Initstack(stack *s){s->base = (int *)malloc(MAX * sizeof(int));if(s->base==NULL)exit(EXIT_FAILURE);s->top=s->base;s->stacksize=MAX;
}//出站并输出
void pop(stack *s){if(s->top!=s->base)printf("%d ",*--s->top);elseprintf("EMPTY ");
}//压栈
void push(stack *s,int j){if(s->top-s->base==s->stacksize)printf("FULL ");else*s->top++=j;
}//遍历输出,先入后出
void print(stack *s){while (s->top != s->base)printf("%d ", *--s->top);
}int main(){stack s;Initstack(&s);int operate,i,j;scanf("%d",&operate); //输入操作次数for(i=0;i<operate;i++){scanf("%d",&j);if(j==0)pop(&s);elsepush(&s,j);}printf("\n");print(&s);return 0;
}
队列
typedef struct QNode{ //队列节点int data;struct QNode *next;
}QNode;
typedef struct Link{QNode *front,*rear;
}LinkQueue;void Init(LinkQueue *l){l.front = l.rear=(QNode*)malloc(sizeof(QNode));l.front->next=NULL;
}void insert(LinkQueue *q,int e){QNode p = (QNode*)malloc(sizeof(QNode));p->data = e;p->next = NULL;q.rear->next = p;q.rear = p; //修改表尾指针指向
}void out(LinkQueue *q){if(q.front == q.rear)return;int e;QNode *p = q.front->next;e = p->data;q.front->next = p->next;if(q.rear == p)q.rear = q.front;free(p);printf("%d",e);
}void main(){LinkQueue q;Init(&q);int e;scanf("%d",&e);insert(&q,e);out(&q);
}