데이터 구조, 링크 기본 조작

5489 단어 링크 조작
체인 테이블 은 데이터 구조 에서 가장 기본 적 인 데이터 구조 로 체인 식 저장 구조 로 이 루어 진 선형 테이블 이다.이것 은 순서 표 에 비해 삽입 과 삭제 할 때 그 후의 요 소 를 이동 할 필요 가 없다.현재 정 수 를 주 고 그 중의 일부 요 소 를 자주 삽입 하고 삭제 합 니 다. 그 중에서 어떤 요 소 를 찾 거나 현재 링크 의 모든 요 소 를 출력 할 수 있 습 니 다.
다음은 기본 적 인 알고리즘 설명 을 드 리 겠 습 니 다.
그림 1: 링크 형식의 정의 와 링크 요 소 를 얻 는 알고리즘 설명
그림 2: 링크 의 삽입 알고리즘 설명
그림 3: 링크 의 삭제 알고리즘 설명
그림 4: 링크 생 성 알고리즘 설명
입력
입력 데 이 터 는 한 그룹 만 있 고 첫 번 째 줄 은 n + 1 개의 정수 가 있 으 며 첫 번 째 정 수 는 이 줄 의 나머지 정수 n 이 고 그 다음은 n 개의 정수 이다.이 줄 의 정 수 는 목록 을 초기 화 하 는 데 사용 되 며, 입력 순 서 는 목록 의 순서 와 반대 된다. 즉, 목록 에 1, 2, 3 이 있 으 면 입력 순 서 는 3, 2, 1 이다.
두 번 째 줄 에는 정수 m 가 있 는데, 대표 아래 에는 m 줄 이 있다.줄 마다 문자열 이 있 습 니 다. 문자열 은 "get", "insert", "delete", "show" 중의 하나 입 니 다."get" 또는 "delete" 라면 그 다음 에 정수 a 를 따 르 면 첫 번 째 요 소 를 얻 거나 삭제 하 는 것 을 의미 합 니 다."insert" 라면 그 다음 에 두 개의 정수 a 와 e 를 따라 a 번 째 위치 앞 에 e 를 삽입 하 는 것 을 의미 합 니 다.쇼 이후 에는 정수 가 없다.
출력
가 져 오 는 데 성공 하면 이 요 소 를 출력 합 니 다.삭제 에 성공 하면 출력 "delete" OK”;가 져 오 는 데 실패 하거나 삭제 에 실패 하면 "get" 을 출력 합 니 다. fail 및 "delete" fail”。삽입 에 성공 하면 출력 "insert OK ", 그렇지 않 으 면 출력" insert fail”。"show" 라면 목록 에 있 는 모든 요 소 를 출력 하고 목록 이 비어 있 으 면 "Link" 를 출력 합 니 다. list is empty”。주: 모든 작은 따옴표 가 출력 되 지 않 습 니 다.
샘플 입력
3 3 2 121showdelete 1showdelete 2showdelete 1showdelete 2insert 2 5showinsert 1 5showinsert 1 7showinsert 2 5showinsert 3 6showinsert 1 8showget 2
샘플 출력
1 2 3delete OK2 3delete OK2delete OKLink list is emptydelete failinsert failLink list is emptyinsert OK5insert OK7 5insert OK7 5 5insert OK7 5 6 5insert OK8 7 5 6 57
#include
#include
#include
#define NULL 0

struct stu{
    int num;
    struct stu *next;
};
int N,n;
int num3;
struct stu *creat(){
    struct stu *head;
    struct stu *p1=NULL;
    struct stu *p2=NULL;
    n=0;
    p1=(struct stu *)malloc(sizeof(struct stu));
    p2=p1;
    if(p1==NULL)
        return NULL;
    else {
        head =NULL;
        scanf("%d",&(p1->num));
        num3=p1->num;
    }
    while(nnext=NULL;
        }
        else{
            p2->next=p1;
        }
        p2=p1;
        p1=(struct stu *)malloc(sizeof(struct stu));
        scanf("%d",&(p1->num));
        num3=p1->num;
    }
    p2->next=NULL;
    free(p1);
    p1=NULL;
    return head;
};
struct stu *del(struct stu *head,int num){
    struct stu *p1;
    struct stu *p2;
    if(head==NULL){
            printf("delete fail
"); return head; } p1=head; n=1; while(nnext!=NULL){ p2=p1; p1=p1->next; n++; } if(n==num){ if(p1==head){ head=p1->next; } else{ p2->next=p1->next; } free(p1); p1=NULL; N-=1; printf("delete OK
"); } else{ printf("delete fail
"); } return head; }; struct stu *insert(struct stu *head,struct stu *node,int num1){ struct stu *p1; n=1; if(head==NULL){ if(num1==1){ head=node; node->next=NULL; N+=1; printf("insert OK
"); } else printf("insert fail
"); return head; } p1=head; if(head!=NULL&&num1==1){ node->next=p1; head=node; printf("insert OK
"); return head; } while(nnext!=NULL){ n++; p1=p1->next; } if(n==num1-1){ node->next=p1->next; p1->next=node; N++; printf("insert OK
"); } else { printf("insert fail
"); } return head; }; struct stu *reverse(struct stu *head){ struct stu *p; struct stu *p1; struct stu *p2; p1=NULL; p2=head; while(p2!=NULL){ p=p2->next; p2->next=p1; p1=p2; p2=p; } head =p1; return head; }; void print(struct stu *head){ struct stu *p; p=head; if(head!=NULL){ do{ printf("%d",p->num); p=p->next; if(p!=NULL) printf(" "); }while(p!=NULL); printf("
"); } else printf("Link list is empty
"); } void gt(struct stu *head,int num){ struct stu *p; p=head; n=1; while(nnext!=NULL){ p=p->next; n++; } if(n==num){ printf("%d
",p->num); } else printf("get fail
"); } int main(){ struct stu *head; struct stu *stu1; scanf("%d",&N); head=creat(); //print(head); head=reverse(head); //print(head); //int num; int i,j; //scanf("%d",&num); //printf("%d
",num); char s[20]; int num1,num2; for(i=0;inum)); head=insert(head,stu1,num1); } else if(strcmp(s,"get")==0){ scanf("%d",&num1); gt(head,num1); } memset(s,'\0',sizeof(s)); } return 0; }

좋은 웹페이지 즐겨찾기