1.链表
声明结构体变量:Node结构体包含两个成员:num
表示节点中存储的数据,next
是指向下一个节点的指针。而 LinkList
则是 Node*
的别名,可以方便地表示链表的头指针。在操做时,基本上都是使用LinkList这种指针形式,比如申请空间等。
注意:LinkList是指针(地址),但->指向的元素还是元素
头插法/尾插法:下面代码都是带头节点版本,注意先初始化头节点head-> next=NULL
函数形参:直接将指针传入函数即可
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int num;
struct Node *next;
}Node,*LinkList; //*LinkList 指的是 *Node就是Node的指针形式
LinkList tailInsert(int n){ //尾插法
LinkList L=(LinkList)malloc(sizeof(Node)); //创建头节点
L->next=NULL; //头节点指向NULL
LinkList tail=L;
for(int i=0;i<n;i++){
int num;
LinkList p=(LinkList) malloc(sizeof(Node)); //创建节点前需要先申请
scanf("%d",&(p->num));
p->next=NULL;
tail->next=p;
tail=p;
}
return L;
}
LinkList headInsert(int n){ //头插法
LinkList L=(LinkList)malloc(sizeof(Node));
L->next=NULL;
for(int i=0;i<n;i++){
int num;
LinkList p=(LinkList)malloc(sizeof(Node));
scanf("%d",&(p->num));
p->num=num;
p->next=L->next;
L->next=p;
}
return L;
}
void prinflist(LinkList p){ //从头节点遍历输出
p=p->next; //因为带头节点,所以先走一位
while (p!=NULL)
{
printf("%d ",p->num);
p=p->next;
}
}
int main(){
int n;
printf("num=");
scanf("%d",&n);
LinkList p;
p=headInsert(n);
prinflist(p);
free(p);
return 0;
}
2.栈
下面是线性栈实现方式,为了统一操做使用指针的方式声明结构体,使用前先申请空间,使用->来读取数据。链栈和链表类似
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //c语言中没有bool类型,要引入包
typedef struct Stack{
int data[50];
int top;
}Stack,*SqStack; //前面要先加一个Stack,后面才是指针(地址)形式SqStack
void InitStack(SqStack s){ //初始化
s->top=-1;
}
bool push(SqStack s,int x){ //入栈
if(s->top==49){
return false;
}
s->top=s->top+1;
s->data[s->top]=x;
return true;
}
int getTop(SqStack s){
return s->data[s->top];
}
int pop(SqStack s){
int data=s->data[s->top];
s->top=s->top-1;
return data;
}
int main(){
SqStack sq= (SqStack)malloc(sizeof(Stack));
InitStack(sq);
printf("请输入入栈序列len=");
int len;
scanf("%d",&len);
for(int i=0;i<len;i++){
int data;
scanf("%d",&data);
if(!push(sq,data)){
break;
}
}
printf("%d\n",pop(sq));
printf("%d\n",pop(sq));
free(sq);
}
3.队列
链队和链表类似,需要声明Node节点和Queue队列的结构体,因为都是用*的方式所以都统一用->
下面是带头节点的队列的编写方法。出队入队,通过画图来理解。从rear插入,front读出
front是链表头 从front开始->node1->node2->rear。注意判断是否队空,队空时front==rear
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h> //c语言中没有bool类型,要引入包
typedef struct Node{ //节点
int data;
struct Node *next;
}Node,*LinkNode;
typedef struct Queue{ //链队
LinkNode front,rear;
}Queue,*LinkQueue;
void InitQueue(LinkQueue q){ //初始化
q->front=q->rear=(LinkNode)malloc(sizeof(Node));
q->front->next=NULL; //带头节点的队列
}
bool isEmpty(LinkQueue q){ //判断队空
if(q->front==q->rear){
return true;
}
else{
return false;
}
}
bool EnQueue(LinkQueue q,int x){ //入队
LinkNode node=(LinkNode)malloc(sizeof(Node));
node->data=x;
node->next=NULL;
q->rear->next=node;
q->rear=node;
return true;
}
bool DeQueue(LinkQueue q){
if(q->front==q->rear){
return false;
}
else{
LinkNode p=(LinkNode)malloc(sizeof(Node));
p=q->front->next;
q->front->next=p->next;
if(q->rear==p){ //队空的时候
q->rear=q->front;
}
free(p);
return true;
}
}
int getdata(LinkQueue q){
int data=q->front->next->data; //因为带头结点
return data;
}
int main(){
LinkQueue queue= (LinkQueue)malloc(sizeof(Queue));
InitQueue(queue);
printf("请输入队列序列len=");
int len;
scanf("%d",&len);
for(int i=0;i<len;i++){
int data;
scanf("%d",&data);
EnQueue(queue,data);
}
printf("%d ",getdata(queue));
DeQueue(queue);
DeQueue(queue);
printf("%d ",getdata(queue));
free(queue);
}