線性表、堆疊、佇列的特點,及程式碼實現(C語音)
阿新 • • 發佈:2019-01-28
一、線性表:
線性表定義:線性表是n個數據元素的有限序列
線性表有多種實現方式,線性、鏈式等,其中線性實現採用隨機儲存的方式:
(線性)
(鏈式)
具體的說明大家可以看書對吧,這裡直接貼出實現C語言程式碼(下面是鏈式儲存實現):
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node,*linklist;
//初始化
void initlist(linklist &head)
{
head=(node*)malloc(sizeof(node));
head->next=NULL;
}
//輸入
void getlist(linklist &head,linklist &p,linklist &q)
{
int i,num;//輸入資料個數
p=head;
printf("請輸入資料個數:");
scanf("%d",&num);
for(i=1;i<=num;i++)
{
q=(node*)malloc(sizeof(node));
printf("請輸入要儲存的第%d數:",i);
scanf("%d",&q->data);
p->next=q;
q->next=NULL;
p=p->next;
}
}
//輸出
void output(linklist &head,linklist &s)
{
for(s=head->next;s!=NULL;s=s->next)
printf("%d ",s->data);
printf("\n");
}
//插入
void insertlist(linklist &head,linklist &p,linklist &s,linklist &q)
{
int flag=1,insflag;//插入的位置
p=head;
printf("請輸入您要插入的位置:");
scanf("%d",&insflag);
while(p->next!=NULL)
{
flag++;
p=p->next;
}
p=head;
while(insflag<=0||insflag>flag)
{
printf("您的輸入錯誤!\n請重新輸入有效位置:");
scanf("%d",&insflag);
}
for(flag=1;flag<=insflag-1;flag++)
{
p=p->next;
}
q=(node*)malloc(sizeof(node));
printf("請輸入您要插入的數:");
scanf("%d",&q->data);
q->next=p->next;
p->next=q;
output(head,s);
}
//刪除
void dellist(linklist &head,linklist &p,linklist &s)
{
int flag=1,delflag;//刪除的位置
p=head;
printf("請輸入您要刪除的位置:");
scanf("%d",&delflag);
while(p->next!=NULL)
{
flag++;
p=p->next;
}
p=head;
while(delflag<=0||delflag>flag)
{
printf("您的輸入錯誤!\n請重新輸入有效位置:");
scanf("%d",&delflag);
}
for(flag=1;flag<=delflag-1;flag++)
{
p=p->next;
}
p->next=p->next->next;
output(head,s);
}
//查詢
void foundlist(linklist &head,linklist &p)
{
int num;//查詢的數
int flag=0,count=1,i;
printf("請輸入要查詢的數:");
scanf("%d",&num);
p=head;
while(p->next!=NULL)
{
if(p->data==num)
{
flag=1;
i=count;
}
p=p->next;
count++;
}
if(flag==1)
printf("有這個數!\n是第%d個數\n",i-1);
else
printf("沒有找到這個數!\n");
}
//選擇選單
void choose(linklist &head,linklist &p,linklist &s,linklist &q)
{
int ch=1;
while(ch)
{
printf("插入請按1,刪除請按2,查詢請按3,退出請按0!\n");
scanf("%d",&ch);
switch(ch)
{
case 1:insertlist(head,p,s,q);break;
case 2:dellist(head,p,s);break;
case 3:foundlist(head,p);break;
case 0:printf("謝謝使用!");break;
default:printf("選擇錯誤!請重新輸入:\n");break;
}
}
}
void main()
{
linklist head,p,s,q;
initlist(head);
getlist(head,p,q);
output(head,s);
choose(head,p,s,q);
}
二、堆疊:定義:棧是限定僅在表尾進行插入或者刪除操作的線性表。
特點:先進後出
C語言實現程式碼:
//棧
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define SIZE 20
typedef struct
{
int * base;
int * top;
int size;
}sqstack;
//初始化
void initstack(sqstack &mystack)
{
mystack.base=(int*)malloc(SIZE*sizeof(int));
mystack.top=mystack.base;
mystack.size=SIZE;
}
//進棧
void push(sqstack &mystack)
{
int e;
printf("請輸入要儲存的數:\n");
scanf("%d",&e);
*mystack.top=e;
mystack.top++;
}
//出棧
void pop(sqstack &mystack)
{
int e;
printf("您儲存的數有:");
if(*&mystack.top!=*&mystack.base)
{
mystack.top--;
e=*mystack.top;
printf("%d\n",e);
}
else
printf("棧已為空!\n");
}
//選單
void choose(sqstack &mystack)
{
int ch=1;
while(ch)
{
printf("入棧請按1,出棧請按2,退出請按0!\n");
scanf("%d",&ch);
switch(ch)
{
case 1:push(mystack);break;
case 2:pop(mystack);break;
case 0:printf("謝謝使用!");exit(0);
default:printf("選擇錯誤!請重新輸入\n");break;
}
}
}
void main()
{
sqstack mystack;
choose(mystack);
}
三、佇列:
定義:佇列是一種先進先出的線性表。
特點:先進先出
C語言程式碼實現:
所有的工程程式碼可以在以下網站下載:#include<stdio.h> #include<stdlib.h> struct Node { int data; struct Node *next; }; struct queue { struct Node *front; struct Node *rear; }; /*初始化鏈隊*/ void initQueue(struct queue *hq) { hq->front=hq->rear=NULL; } /*向鏈隊中插入一個元素x*/ void inQueue(struct queue *hq, int x) { struct Node *newNode; newNode=malloc(sizeof(struct Node)); if(newNode==NULL) { printf("記憶體空間分配失敗! "); exit(1); } newNode->data=x; /*把x的值賦給新結點的值域*/ newNode->next=NULL; /*把新結點的指標域置空*/ if(hq->rear==NULL) { hq->front=hq->rear=newNode; }else { hq->rear=hq->rear->next=newNode; } //return; } /*從佇列中刪除*/ int delQueue(struct queue*hq) { struct Node*p; int temp; if(hq->front==NULL) { printf("佇列為空,無法刪除! "); exit(1); } temp=hq->front->data; p=hq->front; hq->front=p->next; if(hq->front==NULL) { hq->rear=NULL; } free(p); return temp; } /*讀取隊首*/ int peekQueue(struct queue *hq) { if(hq->front==NULL) { printf("佇列為空,無法刪除! "); exit(1); } return hq->front->data; } int emptyQueue(struct queue *hq) { if(hq->front==NULL) { return 1; }else { return 0; } } /*清除鏈隊*/ void clearQueue(struct queue *hq) { struct Node *p=hq->front; while(p!=NULL) { hq->front=hq->front->next; free(p); p=hq->front; } hq->rear=NULL; return; } int main(int argc,char *argv[]) { struct queue q; int a[8]={3,8,5,17,9,30,15,22}; int i; initQueue(&q); for(i=0;i<8;i++) { inQueue(&q,a[i]); } inQueue(&q,68); while(!emptyQueue(&q)) { printf("%d\n",delQueue(&q)); } clearQueue(&q); }