Cデータ構造における単一チェーンテーブルの基本操作
5520 ワード
Cのtypedef
Cのtypedefキーワードの役割は、データ型の新しい名前を定義することです.この目的は2つあります.1つは、変数に覚えやすく、意味が明確な新しい名前を定義することです.例えば、次のようにします.
typedef unsigned char BYTE;
unsigned charタイプをBYTEと自己命名します.もう1つの目的は、struct構造タイプなどの複雑なタイプ宣言を簡略化することです.
typedef struct student { int age; int class; }stu; stu stu_1;//これで従来の方法より1つのstructを少なく書くことができ、比較的手間が省け、特に大量に使用する場合struct student stu_1;//以上はこの定義に等しく,Cではstructオブジェクトを宣言する際にstructキーを付ける必要があると規定している.
typedefを使用して構造体ポインタを定義するには
次のように定義します.
typedef struct TreeNode { int Element; struct TreeNode* LeftChild; struct TreeNode* RightChild; } Node,*PtrToTreeNode;
次のように等価です.
構造体TreeNodeにNodeという別名を付ける.
構造体ポインタTreeNode*にPtrToTreeNodeという別名を付けます.つまりPtrToTreeNodeは実際にはポインタです!
シングルチェーンテーブルの基本操作
チェーンテーブルは、データを線形に格納する構造である(線形構造はデータの論理構造であり、他にもツリー構造、グラフ構造、集合構造がある).チェーンテーブルの格納内容は論理的に連続しているが、物理的に必ずしも連続しているとは限らない.一方向チェーンテーブルの構成は、ヘッダ(head):ポインタドメインのみ、データドメインなし; ノード(node):データドメイン+ポインタドメイン、 表末尾:データドメインのみ、ポインタドメイン(ポインタがNULL)なし、 単一チェーンテーブルノード(node)の定義:
struct node{ int num; struct node* Pnext; }
C言語におけるチェーンテーブルの実現は主に構造体とポインタに依存する.
単一チェーンテーブルの作成、印刷、長さの計算、指定されたノードの削除、ヘッダーの挿入、チェーンテーブルの増分ソート、逆順序、チェーンテーブルのクリアなどの操作を実現します.
2つのアクションを追加します.ヘッド挿入と中間ノードの検索:
Cのtypedefキーワードの役割は、データ型の新しい名前を定義することです.この目的は2つあります.1つは、変数に覚えやすく、意味が明確な新しい名前を定義することです.例えば、次のようにします.
typedef unsigned char BYTE;
unsigned charタイプをBYTEと自己命名します.もう1つの目的は、struct構造タイプなどの複雑なタイプ宣言を簡略化することです.
typedef struct student { int age; int class; }stu; stu stu_1;//これで従来の方法より1つのstructを少なく書くことができ、比較的手間が省け、特に大量に使用する場合struct student stu_1;//以上はこの定義に等しく,Cではstructオブジェクトを宣言する際にstructキーを付ける必要があると規定している.
typedefを使用して構造体ポインタを定義するには
次のように定義します.
typedef struct TreeNode { int Element; struct TreeNode* LeftChild; struct TreeNode* RightChild; } Node,*PtrToTreeNode;
次のように等価です.
構造体TreeNodeにNodeという別名を付ける.
構造体ポインタTreeNode*にPtrToTreeNodeという別名を付けます.つまりPtrToTreeNodeは実際にはポインタです!
シングルチェーンテーブルの基本操作
チェーンテーブルは、データを線形に格納する構造である(線形構造はデータの論理構造であり、他にもツリー構造、グラフ構造、集合構造がある).チェーンテーブルの格納内容は論理的に連続しているが、物理的に必ずしも連続しているとは限らない.一方向チェーンテーブルの構成は、
struct node{ int num; struct node* Pnext; }
C言語におけるチェーンテーブルの実現は主に構造体とポインタに依存する.
単一チェーンテーブルの作成、印刷、長さの計算、指定されたノードの削除、ヘッダーの挿入、チェーンテーブルの増分ソート、逆順序、チェーンテーブルのクリアなどの操作を実現します.
#include
#include
#include
//
typedef struct Node{
int data;
struct Node* next;
}node;
// ,
node* createList(const int length){
node *head,*helper;
helper = head = (node *)malloc(sizeof(node));
for(int i=0;inext = (node *)malloc(sizeof(node));
helper->data = i;
}
helper->next = NULL;
return head;
}
//
void printList(const node* list1){
const node* p=NULL;
p = list1->next; //
while(p){
printf("%d
",p->data);
p = p->next;
}
}
//
int length_list(const node* list1){
int n=0;
if(list1->next==NULL){
return n;
}
while(list1->next!=NULL){
n+=1;
list1=list1->next;
}
return n;
}
// key
node* delete_key(node* list1, int key){
if(list1->next==NULL){
return list1; //
}
node* p, *del;
for(p=list1;p->next!=NULL&&p->next->data!=key;p=p->next);
if(p->next==NULL){
return list1; // key, list1
}
del = p->next;
p->next=p->next->next;
free(del);
del = NULL;
return list1;
}
// key
node* insert_list(node* list1, int key, int head_or_end){
node* insert_key = (node*)malloc(sizeof(node));
insert_key->data = key;
if(head_or_end){
insert_key->next = list1->next;
list1->next = insert_key;
return list1;
}
else{
node* p = list1;
for(p = list1; p->next!=NULL;p=p->next);
p->next = insert_key;
insert_key->next = NULL;
return list1;
}
}
// ( )
node* sort_list(node* list1){
int length = length_list(list1);
if(length==0){ // 0 ,
return list1;
}
for(int i=1;inext;
for(int j=0;jdata>p->next->data){
p->data+=p->next->data;
p->next->data = p->data - p->next->data;
p->data = p->data - p->next->data;
}
p=p->next;
}
}
return list1;
}
//
node* reverse_list(node* list1){
if(list1==NULL||list1->next==NULL){
return list1;
}
node *p1, *p2, *p3;
node *head = (node*)malloc(sizeof(node));
p1 = list1;
p2 = p1->next;
while(p2!=NULL){
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
list1->next->next=NULL;
head->next = p1;
list1 = head;
return list1;
}
//
void delete_all(node* list1){
node* p1=NULL,*p2 = NULL;
p1 = list1->next;
while(p1->next!=NULL){
p2 = p1->next;
free(p1);
p1 = p2;
}
free(p2);
list1->next=NULL;
}
void main()
{
node* List1 =createList(5); //
printList(List1); //
printf("%d
",length_list(List1)); //
List1 = delete_key(List1,3); //
List1 = insert_list(List1,66,1); //
List1 = insert_list(List1,77,0); //
List1 = sort_list(List1); //
printList(List1);
List1 = reverse_list(List1); //
printList(List1);
delete_all(List1); //
printf("%d
",length_list(List1));
return;
}
2つのアクションを追加します.ヘッド挿入と中間ノードの検索:
//
node* create_list_headIN(const int length){
node* head = (node*)malloc(sizeof(node));
node* p;
for(int i=0;idata = i;
p->next = head->next;
head->next = p;
}
head ;
return head;
}
//
node* middle_node(node* list1){
node *p1,*p2;
p1 = p2 = list1;
while(p2 && p2->next){
p1 = p1->next;
p2 = p2->next->next;
}
printf("
%d
",p1->data);
return p1;
}