1.关于栈的应用实例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct Node
{
int data;
struct Node *pNode;
} NODE, *PNODE;
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
} STACK, *PSTACK;
void init_stack(PSTACK);
void push_stack(PSTACK);
bool go_stack(PSTACK);
void traverse_stack(PSTACK ps)
{
if (NULL == ps->pBottom)
{
printf("该栈已销毁!请初始化。\n");
return 0;
}
else if (ps->pTop == ps->pBottom)
{
printf("空栈!\n");
return 0;
}
PNODE t = ps->pTop;
while (t != ps->pBottom)
{
printf("%d\n", t->data);
t = t->pNode;
}
return 0;
}
void empty_stack(PSTACK);
void destroy_stack(PSTACK);
int main(void)
{
STACK s;
init_stack(&s);
push_stack(&s);
push_stack(&s);
push_stack(&s);
go_stack(&s);
traverse_stack(&s);
empty_stack(&s);
traverse_stack(&s);
return 0;
}
void init_stack(PSTACK ps)
{
ps->pTop = (PNODE)malloc(sizeof(NODE));
if (ps->pTop == NULL)
{
printf("内存不足!1\n");
exit(-1);
}
ps->pBottom = ps->pTop;
ps->pBottom->pNode = NULL;
return;
}
void push_stack(PSTACK ps)
{
PNODE t = (PNODE)malloc(sizeof(NODE));
if (NULL == t)
{
printf("内存不足!2\n");
exit(-1);
}
printf("要压值:");
scanf("%d", &t->data);
t->pNode = ps->pTop;
ps->pTop = t;
return;
}
bool go_stack(PSTACK ps)
{
if (ps->pTop == ps->pBottom)
{
printf("空栈!");
return false;
}
PNODE t = ps->pTop;
printf("出栈的元素是:%d\n", t->data);
ps->pTop = ps->pTop->pNode;
free(t);
return true;
}
void empty_stack(PSTACK ps)
{
while (ps->pTop != ps->pBottom)
{
PNODE t = ps->pTop;
ps->pTop = ps->pTop->pNode;
free(t);
}
printf("已清空!\n");
return;
}
2、关于循环队列的应用实例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define len_size 13
typedef struct buffer
{
int buf[len_size];
volatile int in;
volatile int out;
} ris_buf;
int write(ris_buf *sring, int *wbuf, int len)
{
int i;
for (i = 0; i < len; i++)
{
if ((sring->in + 1) % len_size == sring->out)
{
printf("full");
}
sring->buf[sring->in] = wbuf[i];
sring->in = (++(sring->in)) % len_size;
}
return 0;
}
int read(ris_buf *sring, int *rbuf, int len)
{
int i;
for (i = 0; i < len; i++)
{
if (sring->out == sring->in)
{
printf("NULL");
}
rbuf[i] = sring->buf[sring->out];
sring->out = (++sring->out) % len_size;
}
return 0;
}
int date_len(ris_buf *sring)
{
return (sring->in - sring->out + len_size) % len_size;
}
int main(int argc, char **argv)
{
ris_buf ringbuf = {0};
int buf1[12] = {164, 7, 89, 41, 12, 3, 97, 81, 23, 12, 56, 78};
int buf3[12] = {0};
write(&ringbuf, buf1, 12);
read(&ringbuf, buf3, date_len(&ringbuf));
int i=0;
do
{
printf(" $ %d \n",buf3[i]);
i++;
}while(i<12)
printf("\n");
getchar();
return 0;
}
3、关于单项队列应用实例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stdool
{
int *buf;
int in;
int out;
int size;
} std;
std stdol;
#define min(x, y) ((x) < (y) ? (x) : (y))
int init(int *rbuf, int size)
{
std *per = &stdol;
if (rbuf == NULL || size == 0)
{
return -1;
}
memset(per, 0, sizeof(stdol));
per->buf = rbuf;
per->in = per->out = 0;
per->size = size;
return 0;
}
int write(int *wbuf, int len)
{
int i = 0, j = 0;
std *per = &stdol;
j = per->in % per->size;
len = min(len, per->size - per->in + per->out);
i = min(len, per->size - j);
memcpy(per->buf + j, wbuf, i);
memcpy(per->buf, wbuf + i, len - i);
per->in += len;
return len;
}
int read(int *rbuf, int len)
{
int i = 0, j = 0;
std *per = &stdol;
j = (per->out % per->size);
len = min(len, per->in - per->out);
i = min(len, per->size - j);
memcpy(rbuf, per->buf + j, i);
memcpy(rbuf + i, per->buf, len - i);
per->out += len;
return len;
}
int get_speac_len()
{
std *per = &stdol;
return (per->size - (per->in - per->out));
}
int get_date_len()
{
std *per = &stdol;
return (per->in - per->out);
}
void clear()
{
std *per = &stdol;
per->in = per->out = 0;
}
int main(int argc, char **argv)
{
int buf[10] = {0}, buf1[10] = {15, 49, 8, 71, 23, 19, 68, 7, 8, 9};
int len;
init(buf, sizeof(buf));
write(buf1, sizeof(buf));
len = get_date_len();
if (len > 0)
{
len = len > 40 ? 40 : len;
read(buf, len);
}
int i = 0;
while (i < 10)
{
printf("$ %d \n", buf[i]);
i++;
}
getchar();
return 0;
}
4、单链表的应用实例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct list
{
int date;
struct list *next;
} li, *lis;
lis init(lis new)
{
new = (lis)malloc(sizeof(li));
new->next = NULL;
return new;
}
int show(lis n_list)
{
while (n_list->next)
{
n_list = n_list->next;
printf("-%d", n_list->date);
}
return 0;
}
lis add(lis n_list, int date)
{
lis new = (lis)malloc(sizeof(li));
new->date = date;
new->next = NULL;
new->next = n_list->next;
n_list->next = new;
return n_list;
}
bool insert(lis n_list, int x, int date)
{
int i = 0;
while (n_list != NULL && i < x - 1)
{
n_list = n_list->next;
++i;
}
if (i > x - 1 || NULL == n_list)
{
return 0;
}
lis new = (lis)malloc(sizeof(li));
new->next = NULL;
new->date = date;
new->next = n_list->next;
n_list->next = new;
return 1;
}
bool delets(lis n_list, int x)
{
int i = 0;
lis p;
while (n_list->next != NULL && i < x - 1)
{
n_list = n_list->next;
p = n_list;
++i;
}
if (i > x - 1 || n_list->next == NULL)
{
return 0;
}
lis q = p->next;
p->next = p->next->next;
free(q);
q = NULL;
return 1;
}
lis find(lis list_n, int date)
{
int i, j;
while (list_n->next)
{
if (list_n->date == date)
{
i++;
printf("%d", j);
}
j++;
list_n = list_n->next;
}
printf("tol: %d ", i);
return list_n;
}
lis list_exch(lis list_n, int node, int date)
{
for (int i = 1; i < node; i++)
{
list_n = list_n->next;
}
add(list_n, date);
return list_n;
}
lis del(lis n_list, int date)
{
lis p;
while (n_list->date != date)
{
p = n_list;
n_list = n_list->next;
}
p->next = n_list->next;
free(n_list);
return n_list;
}
int sort(lis n_list, int len)
{
lis p, q, t;
int j, i;
for (i = 0, p = n_list->next; i < len - 1; i++, p = p->next)
{
for (j = i + 1, q = p->next; j < len; j++, q = q->next)
{
if ((p->date) > (q->date))
{
p->date = p->date ^ q->date;
q->date = p->date ^ q->date;
p->date = p->date ^ q->date;
}
}
}
return 0;
}
int main(int argc, char **argv)
{
lis list_new = init(list_new);
for (int i = 1; i < 10; i++)
{
add(list_new, i);
}
show(list_new);
printf("--\n");
insert(list_new, 5, 56);
show(list_new);
printf("--\n");
delets(list_new, 4);
show(list_new);
printf("--\n");
sort(list_new, 9);
show(list_new);
getchar();
return 0;
}
5、双向链表的应用实例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct list
{
int date;
struct list *prev;
struct list *next;
} li, *lis;
lis init(lis list_n)
{
list_n = (lis)malloc(sizeof(li));
list_n->date = 0;
list_n->next = list_n->prev = NULL;
return list_n;
}
lis add(lis list_n, int x)
{
int date;
for (int i = 0; i < x; i++)
{
printf("请输入:");
scanf("%d", &date);
lis node = (lis)malloc(sizeof(li));
node->date = date;
node->next = node->prev = NULL;
list_n->next = node;
node->prev = list_n;
list_n = list_n->next;
}
return list_n;
}
lis insert(lis list_n, int x, int date)
{
lis node = (lis)malloc(sizeof(li));
node->date = date;
node->next = node->prev = NULL;
if (x == 1)
{
node->next = list_n;
list_n->prev = node;
list_n = node;
}
else
{
for (int i = 1; i < x - 1; i++)
{
list_n = list_n->next;
}
if (list_n->next == NULL)
{
list_n->next = node;
node->prev = list_n;
}
else
{
list_n->next->prev = node;
node->next = list_n->next;
list_n->next = node;
node->prev = list_n;
}
}
return list_n;
}
lis del(lis list_n, int date)
{
while (list_n)
{
if (list_n->date == date)
{
list_n->prev->next = list_n->next;
list_n->next->prev = list_n->prev;
free(list_n);
return list_n;
}
list_n = list_n->next;
}
return list_n;
}
lis show(lis list_n)
{
while (list_n->next)
{
list_n = list_n->next;
printf("-%d", list_n->date);
}
}
int main(int argc, char **argv)
{
lis list;
int x, xi;
list = init(list);
add(list, 5);
printf("\n");
show(list);
printf("\n");
puts("请输入要删除的数值:");
scanf("%d", &x);
del(list, x);
show(list);
printf("\n");
puts("请输入在第x位置要插入的数值:");
scanf("%d %d", &xi, &x);
insert(list, xi + 1, x);
show(list);
getchar();
return 0;
}