データ構造学習(三)-単一チェーンテーブルの操作の検索、削除、挿入.

4115 ワード

チェーンテーブルを作成する方法は、テールプラグ法を採用し、改良版のテールプラグ法、すなわち補助ヘッドノードを追加します.
次のコードは、挿入、削除、検索の全体的な操作です.ここで、検索は値別と位置別に分けられます.削除と挿入は、指定された場所で操作されます.
#include 
#include 

typedef struct list
{
	char data;
	struct list *next;
}linklist;

linklist *CreateLinklist_End();					//       
linklist *Linklist_FindPos(linklist *h, int pos);		//        
linklist *Linklist_FindDat(linklist *h, char dat, int *i);	//      
int Linklist_Insert(linklist *h, int pos, char dat);		//       
int Linklist_Delete(linklist *h,  int pos);			//       
void ShowLinklist(linklist *h);					//      

int main(void)
{
	linklist *head, *p;
	int choice, pos, ans;
	char dat;

	printf("          
"); printf(" , , ('#' ):
"); head = CreateLinklist_End(); while(1) { printf("
"); printf("1.
"); printf("2,
"); printf("3.
"); printf("4.
"); printf("5.
"); printf("6.
"); printf(" :"); scanf("%d", &choice); getchar(); // . switch(choice) { case 1: printf(" :"); scanf("%d", &pos); p = Linklist_FindPos(head, pos); if(p) printf(" %d :%c
", pos, p->data); else printf("
"); break; case 2: printf(" :"); scanf("%c", &dat); p = Linklist_FindDat(head, dat, &pos); if(p) { printf(" :%c
", p->data); printf(" :%d
", pos); } else { printf(" !
"); } break; case 3: printf(" ( ):"); scanf("%c %d", &dat, &pos); ans = Linklist_Insert(head, pos, dat); if(ans) printf(" !
"); else printf("
"); break; case 4: printf(" :"); scanf("%d", &pos); ans = Linklist_Delete(head, pos); if(ans) printf(" !
"); else printf(" !
"); break; case 5: printf(" :"); ShowLinklist(head); break; case 6: return 0; break; default: printf(" !
"); break; } } } // linklist *CreateLinklist_End() { linklist *head, *p, *e; char ch; head = (linklist*)malloc(sizeof(linklist)); e = head; ch = getchar(); getchar(); // while(ch != '#') { p = (linklist*)malloc(sizeof(linklist)); p->data = ch; e->next = p; e = p; ch = getchar(); getchar(); // } e->next = NULL; return head; } // linklist *Linklist_FindPos(linklist *h, int pos) { linklist *p; int i = 1; p = h->next; while(inext; i++; } if(i == pos) // return p; else return NULL; } // linklist *Linklist_FindDat(linklist *h, char dat, int *i) { linklist *p; p = h->next; *i = 1; while(p != NULL) { if(p->data != dat) { *i = *i + 1; p = p->next; } else break; // } return p; } // int Linklist_Insert(linklist *h, int pos, char dat) { linklist *p, *l; int i=0; p = h; while(inext != NULL) // { i++; p = p->next; } if(i == pos-1) // { l = (linklist*)malloc(sizeof(linklist)); l->data = dat; l->next = p->next; p->next = l; } else return 0; return 1; } // int Linklist_Delete(linklist *h, int pos) { linklist *p, *s; int i = 0; p = h; while(inext != NULL) // { i++; p = p->next; } if(i != pos-1 || p->next == NULL) // return 0; s = p->next; p->next = s->next; free(s); return 1; } // void ShowLinklist(linklist *h) { linklist *p; p = h->next; while(p != NULL) { printf("%c ", p->data); p = p->next; } printf("
"); }