数据结构
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。常见的数据结构如下:
队列
队列是一种特殊的线性结构,它只允许在队列的首部进行删除操作,这成为“出队”,而在队列的尾部进行插入操作,这称为“入队”。当队列中的中没有元素时,称为空队列。队列遵循先进先出原则(First In First Out FIFO)
队列的三个基本元素(一个数组,两个变量)
将这些元素封装成一个结构体类型
typedef struct {
int data[100];
int head;
int tail;
}queue;
queue a;
a.head = 1;
a.tail = 1;
for (int i = 1; i <= 9; i++) {
//依次向队列插入9个数
scanf("%d",&a.data[a.tail]);
a.tail++;
}
while (a.head < a.tail) {
//打印队首并将队首出队
printf("%d ",a.data[a.head]);
a.head++;
//先将新队首的数添加到队尾
a.data[a.tail] = a.data[a.head];
a.tail++;
a.head++;
}
栈
栈是一种先进先出的数据结构,它限定只能在一段进行插入和删除操作。栈的实现很简单,只需要一个数组和一个指向栈顶得变量top就可以了,我们通过top来进行插入和删除操作。
char a[101],s[101];
int i,len,mid,next,top;
gets(a);//读入一行字符串
len = strlen(a);//求字符串的长度
mid = len/2-1;//求字符串的中点
top = 0;
//将mid之前的字符依次入栈
for (int i = 1; i <= mid; i++) {
s[++top] = a[i];
}
//判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
if(len % 2 == 0){
next = mid+1;
}else{
next = mid+2;
}
//开始匹配
for (int i = next; i <= len-1; i++) {
if (a[i]!=s[top]) {
break;
}
top--;
}
//如果top的值为0,则说明栈内所有的字符都被一一匹配了
if(top == 0){
printf("YES");
}else{
printf("NO");
}
链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。
struct node *head,*p,*q = NULL,*t;
int i,n,a;
scanf("%d",&n);
head = NULL;
for (i = 1; i <= n; i++) {
scanf("%d",&a);
p = (struct node *)malloc(sizeof(struct node));
p->data = a;
p->next = NULL;
if (head == NULL) {
head = p;
}else{
q->next = p;
}
q = p;
}
t = head;
while (t != NULL) {
printf("%d ",t->data);
t = t->next;
}
return 0;
在链表中插入
while (t != NULL) {
if (t->next == NULL || t->next->data > a) {
p = (struct node*)malloc(sizeof(struct node));
p->data = a;
p->next = t->next;
t->next = p;
break;
}
t = t->next;
}
模拟链表
每个链表结点由两部分组成,一是本身的数据,二是他之后的数,我们之前用结构体来表示这个结点,在这里我们也可以用两个数组表示。思路:数组A表示每个序列中的数字,数组B则表示对应的的下一个结点的在数组A中的位置。
具体代码实现:
int data[101],ringt[101];
int i,n,t,len;
//读入已有的数字
scanf("%d",&n);
for (i = 1 ; i <= n; i++) {
scanf("%d",&data[i]);
}
len = n;
//初始化数组right
for (i = 1; i <= n; i++) {
if (i!=n) {
ringt[i] = i+1;
}else{
ringt[i] = 0;
}
}
//直接在数组data的末尾增加一个数字
len++;
scanf("%d",&data[len]);
//从链表的头部开始遍历
t = 1;
while (t != 0) {
if (data[ringt[t]] > data[len]) {//如果当前结点下一个结点的值大于待插入的数,将数插入到中间
ringt[len] = ringt[t];//新插入数的下一个结点标号等于当前结点的下一个标号
ringt[t] = len;//当前结点的下一个结点编号就是新插入的书的编号
break;//插入完成跳出循环
}
t = ringt[t];
}
//遍历链表
t = 1;
while (t!= 0) {
printf("%d ",data[t]);
t = ringt[t];
}