2.1 リニアテーブルの論理構造
2.2 リニアテーブルの順次格納構造
シーケンステーブル:ランダムアクセス(アクセス、読み書き)
リンクリスト:シーケンシャルアクセス
typedef int ElemType;
#define MAXSIZE 100 /*数组最大空间*/
typedef struct{
ElemType data[MAXSIZE]; /*表中元素用数组存放/
int length; /*表长度(表中有多少个元素)*/
}SqList; /*顺序表的类型*/
Sqlist s1,s2;
s1.data[i-1]=90
シーケンステーブルの基本動作実現(コード実現)
- 初期化
- 入れる
- 消去
- 見上げる
アプリケーション例
シーケンス リスト アルゴリズムの時間計算量解析
線形テーブルの概要
2.3 線形テーブルの連鎖表現と実現
(1) 単一連結リストの確立
テールプラグ
頭の挿入
LinkList createLinkList1() //头插法建立带表头结点的单链表
{
LNode *L,*s; //L头指针, s指向新结点
L=(LNode *) malloc(sizeof(LNode)); //申请空白结点,L指向头结点
L->next =NULL; //建立了头结点
for(i=26;i>=1;i--)
{
s=(LNode *) malloc(sizeof(LNode)); //申请空白结点,s指向
if (!s) return NULL;
s->data=i+‘a’-1; //给s->data 赋值
s->next=L->next; L->next =s; //s指向的结点插入头结点后面
}
return L;
}
(2) 単一連結リストの検索と出力
bool GetElem1(LinkList L, int i, ElemType *e)
{
//读取带表头结点的单链表L的第i个数据元素
LNode *p=L->next; //从头指针开始
int j=1;
while(p&&j<i) //查找第i个元素
{
p=p->next;
j++;
}
if( !p || j>i ) return false; //第i个元素不存在,i>n或i<1
*e=p->data;
return true;
}
(3) 単一連結リストの挿入
(4) 単一連結リストの削除
アプリケーション例
LinkList mergeDList(LinkList La,LinkList Lb)
{
LinkList Lc;
LNode *pa,*pb,*pc,*pt;
int tmp;
pa=La->next ; pb=Lb->next ;
pc=(LNode*) malloc(sizeof(LNode));
if (!pc) return NULL;
Lc=pc;
while (pa&&pb)//依次比较
{
pt=(LNode*)malloc(sizeof(LNode));
tmp=compare(pa->data ,pb->data);
if (tmp==-1 ||tmp == 0)
{
pt->data=pa->data ; pa=pa->next ; }
else //tmp==-2
{
pt->data=pb->data ; pb=pb->next ; }
pc->next =pt; pt->next =NULL; //插入Lc表尾
pc=pc->next;
}
pa=pa?pa:pb;
while (pa)//不空的表,剩余元素插入Lc
{
pt=(LNode*)malloc(sizeof(LNode));
pt->data=pa->data ;
pc->next =pt; pt->next =NULL;
pa=pa->next ; pc=pc->next;
}
return Lc;
![在这里插入图片描述](https://img-blog.csdnimg.cn/d3ad08ff79f64355a9976bff4590daa8.png)
}
循環連結リスト
二重連結リスト
応用例:単項多項式の表現と加算
まとめ