一、特点
1、表头、表尾,其他元素有且仅有一个直接前驱和直接后继
2、任何位置可以插入、删除
二、存储方式
1、顺序表
2、链表(单向链表、双向循环链表)
三、具体实现方式
1、顺序表
问题:
用顺序表存储一些正整数,输入正整数表示插入数据(比如输入3表示插入3),输入负整数表示删除数据(比如输入-2表示删除2),输入字符表示退出程序。插入和删除的过程中保持该表递增有序。
//seqlist.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define SIZE 10 /*数组的长度*/
typedef int datatype; /*定义结构体*/
typedef struct seqlist
{
datatype data[SIZE]; //数组
int last; //定位元素
}seq_list, *seq_plist;
#endif
//test.c
#include "seqlist.h"
int main(void)
{
int a; //输入的数
int ret;
seq_plist s;
s = seqlist_init(); //初始化顺序表
while(1){
printf("请输入一个数:\n");
ret = scanf("%d", &a);
if(ret != 1)
exit(1);
else if(data >= 0)
seqlist_insert(s, a);
else
seqlist_del(s,-a);
}
return 0;
}
//seqlist.c
#include "seqlist.h"
seq_plist seqlist_init(void) //初始化函数
{
seq_plist s;
s = (seq_plist)malloc(sizeof(seq_list));
if(NULL == s){
printf("malloc failed!\n");
exit(1);
}
s->last = -1;
return s;
}
void seqlist_insert(seq_plist s, typedata a) //插入函数
{
if(seqlist_full(s))
return;
int i,j;
for(i = 0 ; i <= s->last; i++)
if(a < s->data[i])
break;
for(j = s->last; j >= i; j--)
s->data[j+1] = s->data[j];
s->data[i] = data;
s->last++;
seqlist_show(s);
}
void seqlist_del(seq_plist s, typedata a) //删除函数
{
if(seqlist_empty(s))
return;
int i,j;
for(i = 0; i <= s->last; i++)
if(a = s->data[i])
break;
for(j = i; j < s->last; j++)
s->data[j] = s->data[j+1];
s->last--;
seqlist_show(s);
}
bool seqlist_full(seq_plist s) //判断顺序表是否已满
{
if(s->last == size-1)
return true;
else
return false;
}
bool seqlist_empty(seq_plist s) //判断顺序表是否已空
{
if(s->last == -1)
return true;
else
return false;
}
void seqlist_show(seq_plist s) //打印顺序表
{
int i;
for(i = 0; i <= s->last; i++)
printf("%d\t", s->data[i]);
printf("\n");
}
转载于:https://blog.51cto.com/wuyunncu/1684915