一、线性表:
线性表定义:线性表是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);
}
所有的工程代码可以在以下网站下载:
【工程下载】http://download.csdn.net/detail/tiandixuanwuliang/9807964