数据结构中的线性表分为顺序表和链表两种,本文主要介绍两种表的插入删除查找操作
顺序表
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 10
typedef struct{
int *data; //可以使用数组进行静态分配,但我们这里使用动态分配
int len,max;
}sqlist;
void Initlist(sqlist &l)//初始化表
{
l.data = (int*)malloc(Maxsize*sizeof(int)); //malloc函数会分配一段连续的空间
l.len =0;
l.max = Maxsize;
}
void printflist(sqlist &l)//输出表中的类容
{
for(int i=0;i<l.len;i++){
printf("%d",l.data[i]);
}
printf("\n");
}
bool Listinert(sqlist &l , int index , int elemtype)//元素的插入操作
{
if(index<0&&index>l.len)//判断我们需要插入的元素位置是否合法
{
return false;
}
if(l.len==Maxsize)//如果我们的表已经满了的情况下插入一个元素,为了防止越界,我们需要先扩展
{
int* data2 = (int*)malloc((Maxsize+1)*sizeof(int));//已经分配好的空间不能再增加
//所以我们需要一个新空间
for(int i=0;i<l.len;i++)//将原来的数据复制到新空间
{
data2[i]=l.data[i];
}
free(l.data);
l.data = data2;
l.max ++;
}
for(int i=l.len;i>=index;i--)//依次向后移一位
{
l.data[i]=l.data[i-1];
}
l.data[index-1] = elemtype;
l.len++;
return true;
}
bool Listdelete(sqlist &l,int index)//删除操作
{
if(index<0&&index>l.len){
return false;
}
if(index == l.len){
l.data[l.len-1]=0;
return true;
}
for(int i=index-1;i<l.len-1;i++){
l.data[i]=l.data[i+1];
}
return 0 ;
}
bool Locateelem(sqlist &l,int e)//按值查找
{
for(int i=0;i<l.len;i++){
if(l.data[i]==e){
printf("%d",i+1);
return true;
}
}
return false;
}
int main(){
sqlist l;
Initlist(l);
for(int i=0;i<Maxsize;i++){
l.data[i]=i;
l.len++;
}
printflist(l);
Listinert(l , 5 ,17);
printflist(l);
Listdelete(l , 5);
printflist(l);
Locateelem(l,5);
}
链表
#include<stdio.h>
#include<stdlib.h>
typedef struct lnode{
int data;
struct lnode* next ;
}lnode ,*linklist;//这个*linklist相当于struc lnode*
bool headlist(linklist &l){ //创建头节点
l = (lnode*)malloc(sizeof(lnode));
l->next =NULL;
return true;
}
void printflist(linklist &l){//输出链表
lnode* p =l->next;//头节点要跳过
while(p->next!=NULL){
printf("%d",p->data);
p=p->next;
}
printf("%d\n",p->data);
}
bool cretelist(linklist &l , int len){创造单链表
lnode* p = l;
for(int i=0;i<len;i++){
p->next = (lnode*)malloc(sizeof(lnode));
p =p->next;
p->data = i;
p->next =NULL;
}
return true;
}
int len_list(linklist &l){//查询链表长度
lnode* p=l;
int len =1;
while(p->next){
len++;
p=p->next;
}
return len;
}
lnode* getelem(linklist &l , int index){//查找元素
lnode*p = l;
int i=0;
while(p!=NULL&&i<index)
{ p = p->next;
i++;
}
return p ;
}
bool listinsert(linklist &l,int index ,int e){
lnode* p =l;
lnode*s = (lnode*)malloc(sizeof(lnode));
s->data = e;
int i=0;
while(p!=NULL&&i<index-1)
{ p = p->next;
i++;
}
if(p ==NULL){
return false;
}
s->next=p->next;
p->next = s;
return true;
}
bool deleteelem(linklist &l ,int index){//删除操作
lnode* p =l;
int i =0;
while(p!=NULL&&i<index-1)
{ p = p->next;
i++;
}
if(p ==NULL){
return false;
}
p->next = p->next->next;
}
int main(){
linklist l;
Initlist(l);
if(cretelist(l,5))
printflist(l);
printf("%d\n",len_list(l));
if(getelem(l,3))
printf("%d\n",getelem(l,3)->data);
if(listinsert(l,2,9))
printflist(l);
if(deleteelem(l,3)){
printflist(l);
}
}
双链表只需要每个节点加一个指向前驱的指针就行
插入删除时还需要考虑前驱指针
typedef struct lnode{
int data;
struct lnode* next;
struct lnode* prior;
}lnode ,*linklist;
bool Initlist(linklist &l){
l = (lnode*)malloc(sizeof(lnode));
l->prior =NULL;
l->next =NULL;
return true;
}
bool listinsert(linklist &l,int index ,int e){
lnode* p =l;
lnode*s = (lnode*)malloc(sizeof(lnode));
s->data = e;
int i=0;
while(p!=NULL&&i<index-1)
{ p = p->next;
i++;
}
if(p ==NULL){
return false;
}
s->next=p->next;
p->next->prior =s;
p->next = s;
s->prior = p;
return true;
}
bool deleteelem(linklist &l ,int index){
lnode* p =l;
int i =0;
while(p!=NULL&&i<index-1)
{ p = p->next;
i++;
}
if(p ==NULL){
return false;
}
p->next = p->next->next;
p->next->prior = p;
}