顺序表
特点:
写代码主要就是增删改查!!!
写代码的边界性非常重要以及考研插入和删除的位置都是从1开始,而数组下标是从0开始
【注】下标和位置的关系
线性表最重要的是插入和删除会涉及边界问题以及判断是否合法
【判断合法】"位置<1 || 位置 > 线性表的长度加一" 这是插入数据的判断合法性
因为插入数据只能在数据中间插入或者在数据末尾插入
"位置<1 || 位置 > 线性表的长度" 这是删除数据的合法性边界判断
因为删除数据只能在已有数据中进行删除
插入代码展示及解释
所谓的插入只不过是"把要插入的位置的数据以及该位置后面的数据都统一往后面移动而已"
所以应该有两种方法
"1.从要插入的位置的原始数据开始往后移,但是这样会导致啥问题了???"
对的!!!会把后面的原始数据全部覆盖了
所以要从后面往前面移动
//插入
bool insert_list(SeqList &l,int pos,int data)
{
if (pos<1 || pos > l.len + 1)
{
return false;
}
if (l.len == MAX_NUM)
{
return false;
}
for (int i = l.len; i >= pos ; --i)
{
l.data[i] = l.data[i - 1];
}
l.data[pos-1] = data;//位置和下标差1
++l.len;
return true;
}
#include<stdio.h>
#define MAX_NUM 20
typedef int ElemType;
typedef struct {
ElemType data[MAX_NUM];
int len;//实际长度
}SeqList;
bool insert_list(SeqList &l,int pos,int data)
{
if (pos<1 || pos > l.len + 1)
{
return false;
}
if (l.len == MAX_NUM)
{
return false;
}
for (int i = l.len; i >= pos ; --i)
{
l.data[i] = l.data[i - 1];
}
l.data[pos-1] = data;//位置和下标差1
++l.len;
return true;
}
void print_list(SeqList& l)
{
for (int i = 0; i < l.len; ++i)
{
printf("%3d", l.data[i]);
}
printf("\n");
}
bool del_list(SeqList& l, int pos)
{
if (pos<1 || pos > l.len)
{
return false;
}
for (int i = pos-1; i < l.len-1; ++i)
{
l.data[i] = l.data[i + 1];
}
--l.len;
return true;
}
bool search_list(SeqList& l, int pos)
{
if (pos<1 || pos > l.len)
return false;
else
return true;
}
int main()
{
SeqList l;
l.data[0] = 1;
l.data[1] = 2;
l.data[2] = 3;
l.len = 3;
int insert_data = 0;
scanf("%d", &insert_data);
bool ret = insert_list(l, 2, insert_data);
if (ret)
print_list(l);
else
puts("false");
int pos = 0;
scanf("%d", &pos);
ret = del_list(l, pos);
if (ret)
print_list(l);
else
puts("false");
return 0;
}
链表
增删查改
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode* next;
}Lnode,*LinkList;
void insert_head_list(LinkList& l)
{
ElemType data = 0;
scanf("%d", &data);
while (data != 9999)
{
LinkList tmp = (LinkList)malloc(sizeof(Lnode));
tmp->data = data;
tmp->next = l->next;
l->next = tmp;
scanf("%d", &data);
}
}
void insert_tail_list(LinkList& l)
{
LinkList cur = l;
ElemType data = 0;
scanf("%d", &data);
while (data != 9999)
{
LinkList tmp = (LinkList)malloc(sizeof(Lnode));
tmp->next = cur->next;
tmp->data = data;
cur->next = tmp;
cur = tmp;
scanf("%d", &data);
}
}
//删除
bool delete_list(LinkList& l,int pos)
{
//头结点的位置是0,真正有数据的为第一个节点,也就是第一个位置
if (pos < 1)
{
return false;
}
LinkList cur = l -> next;
//找要删除位置的前一个节点的位置
for (int i = 1; cur && i < pos-1 ; ++i)
{
cur = cur->next;
}
LinkList del = cur->next;
cur->next = del->next;//断链
free(del);
return true;
}
void print_list(LinkList& l)
{
LinkList cur = l->next;
while (cur)
{
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}
bool insert_pos(LinkList& l, int pos,int val)
{
//头结点的位置是0,真正有数据的为第一个节点,也就是第一个位置
if (pos < 1)
{
return false;
}
LinkList cur = l->next;
//找要插入位置的前一个节点的位置
for (int i = 1; cur && i < pos - 1; ++i)
{
cur = cur->next;
}
LinkList v = (LinkList)malloc(sizeof(LNode));
v->data = val;
v->next = cur->next;
cur->next = v;
return true;
}
int main()
{
LinkList l = (LinkList)malloc(sizeof(Lnode)); //存储头节点的头指针
l->next = NULL;
//insert_head_list(l);//头插法
insert_tail_list(l);//尾插法
print_list(l);
delete_list(l, 2);
print_list(l);
insert_pos(l, 3, 999);
print_list(l);
return 0;
}
后序会补上