資料結構--單鏈表
阿新 • • 發佈:2018-12-18
single_linklist.h
#ifndef __SINGLE_LINKLIST_H__ #define __SINGLE_LINKLIST_H__ #include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct node{ datatype data; struct node *next; }listnode,*linklist; linklist create_linklist(void); linklist create_n_linklist(void); int delete_pos_linklist(linklist L,int pos); void clear_linklist(linklist L); int get_length_linklist(linklist L); linklist get_list_pos_linklist(linklist L,int pos); linklist get_list_locate_linklist(linklist L,datatype x); int insert_head_linklist(linklist L,datatype x); int insert_n_head_linklist(linklist L); int insert_end_linklist(linklist L,datatype x); int insert_n_end_linklist(linklist L); int insert_pos_linklist(linklist L,datatype x,int pos); int insert_order_linklist(linklist L,datatype x); void reverse_linklist(linklist); void sort_linklist(linklist L); void show_linklist(linklist L); #endif
single_linklist.c
#include "single_linklist.h" linklist create_linklist(void) { linklist L; if((L=(linklist)malloc(sizeof(listnode))) == NULL) { printf("malloc no memmory!\n"); return NULL; } L->data = 0; L->next = NULL; return L; } linklist create_n_linklist(void) { linklist L,H,r; datatype x; if((L=(linklist)malloc(sizeof(listnode))) == NULL) { printf("malloc no memmory!\n"); return NULL; } L->data = 0; L->next = NULL; r = L; while(1) { printf("Please input a number(-1 exit :"); while(scanf("%d",&x) != 1) { printf("Please input a number(-1 exit :"); getchar(); } if(x == -1)break; if((H=(linklist)malloc(sizeof(listnode))) == NULL) { printf("malloc no memmory!\n"); return L; } H->data = x; H->next = NULL; r->next = H; r=H; } return L; } int delete_pos_linklist(linklist L,int pos) { linklist r,p; if(pos == 0) { r = L; } else { r = get_list_pos_linklist(L,pos-1); } if(r == NULL || r->next==NULL) { printf("argc is iavalid!\n"); return -1; } else { p = r->next; r->next = p->next; free(p); p->next = NULL; return 0; } } void clear_linklist(linklist L) { while(get_length_linklist(L)) { delete_pos_linklist(L,get_length_linklist(L)-1); } free(L); L->next = NULL; L = NULL; } int get_length_linklist(linklist L) { int i=0; linklist r; r = L; while(r->next) { r = r->next; i++; } return i++; } linklist get_list_pos_linklist(linklist L,int pos) { int i=-1; linklist r; if(L->next == NULL) { printf("list is NULL!\n"); return NULL; } if(pos<0 || pos>get_length_linklist(L)-1) { printf("input pos is invalid!"); return NULL; } r = L; while(i<pos) { r = r->next; i++; } return r; } linklist get_list_locate_linklist(linklist L,datatype x) { linklist r; if(L->next == NULL) { printf("list is NULL!\n"); return NULL; } r = L->next; while(r->data != x) { if(r->next == NULL) { printf("value is not in list!\n"); return NULL; } r = r->next; } return r; } int insert_head_linklist(linklist L,datatype x) { linklist H; if((H=(linklist)malloc(sizeof(listnode))) == NULL) { printf("malloc no memmory\n"); return -1; } H->data = x; H->next = L->next; L->next = H; return 0; } int insert_n_head_linklist(linklist L) { datatype x; while(1) { printf("Please input a number(-1 exit:"); while(scanf("%d",&x) != 1) { printf("Please input a number:(-1 exit"); getchar(); } if(x == -1)break; insert_head_linklist(L,x); } return 0; } int insert_end_linklist(linklist L,datatype x) { linklist r,H; if((H = (linklist)malloc(sizeof(listnode))) == NULL) { printf("malloc no memmory!"); return -1; } r = L; while(r->next) { r = r->next; } H->next = NULL; H->data = x; r->next = H; return 0; } int insert_n_end_linklist(linklist L) { datatype x; while(1) { printf("Please input a number(-1 exit:"); while(scanf("%d",&x) != 1) { printf("Please input a number:(-1 exit"); getchar(); } if(x == -1)break; insert_end_linklist(L,x); } return 0; } int insert_pos_linklist(linklist L,datatype x,int pos) { linklist K,r; if(pos == 0) { r = L; } else { r = get_list_pos_linklist(L,pos-1); } if(r == NULL) { printf("argc is invalid!\n"); return -1; } else { if((K = (linklist)malloc(sizeof(listnode))) == NULL) { printf("malloc no memmory!"); return -1; } K->data = x; K->next = r->next; r->next = K; } return 0; } int insert_order_linklist(linklist L,datatype x) { linklist r,H; if((H = (linklist)malloc(sizeof(listnode))) == NULL) { printf("malloc no memmory!\n"); return -1; } H->data = x; r = L; while(r->next && r->next->data<x) { r = r->next; } H->next = r->next; r->next = H; return 0; } void reverse_linklist(linklist L) { linklist r,p; if(L->next == NULL) { printf("list is NULL!\n"); return ; } r = L->next; L->next = NULL; while(r) { p = r; r = r->next; p->next = L->next; L->next = p; } return ; } void sort_linklist(linklist L) { linklist r,p,q; if(L == NULL) { printf("list is NULL!\n"); return ; } r = L->next; L->next = NULL; while(r) { p = r; r = r->next; q = L; while(q->next && q->next->data < p->data) { q = q->next; } p->next = q->next; q->next = p; } } void show_linklist(linklist L) { if(L->next == NULL) { printf("list is NULL!\n"); return ; } while(L->next) { printf("%d\t",L->next->data); L = L->next; } puts(""); return ; }
main.c
#include "single_linklist.h" int main(int argc, const char *argv[]) { int n=0; linklist K; puts("##########--homework one--##############"); K = create_linklist(); for(n=2;n<7;n++) { insert_end_linklist(K,n*2); } show_linklist(K); while(1) { printf("Please input a number (-1 exit :"); while(scanf("%d",&n) != 1) { printf("Please input a number (-1 exit :"); getchar(); } if(n == -1)break; insert_order_linklist(K,n); show_linklist(K); } puts("##########--homework two--##############"); reverse_linklist(K); show_linklist(K); clear_linklist(K); show_linklist(K); return 0; }
執行結果