雙向鏈表的操做

/*************************************************************************
    > File Name: double_link.c
    > Author: heathcliff
    > Mail: --------------------------- 
    > Created Time: 2016年03月30日 星期三 11時15分05秒
 ************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct DulNode
{
    char name[20];
    struct DulNode *prior,*next;
}stud;

stud *create(int n);
void print(stud *head);
void search(stud *head,int n);
stud *delete(stud *head,int n);
stud *insert(stud *head,int n);

int main(void)
{
    stud * head;
    int n = 3;

    head = create(n);   
    print(head);
//  search(head,n);
//  head = delete(head,n);
//  print(head);
    head = insert(head,n);

    return 0;
}

stud *create(int n)
{
    stud *p,*head,*s;
    int i;
    head = (stud *) malloc (sizeof(stud));
    head->name[0] = '\0';
    head->next = NULL;
    p = head;

    for(i = 0;i<n;i++){
        s = (stud *) malloc (sizeof(stud));

        printf("please input student's name:");

        scanf("%s",p->name);
        /*將p和s鏈接起來*/
        p->next = s; //指定後繼節點
        s->prior = p;//指定前驅節點
        p = p->next;//p 向後移動一格
        //p = s;//這個也是能夠的
    }

    p->next = NULL;
    head->prior = NULL;

    return head;
}

void print(stud *head)
{
    stud *p;
    p = head;

    while(p != NULL){
        printf("\n------------print--------\n");
        printf("%4s\n",p->name);
        p = p->next;
    }
}

void search(stud *head,int n)
{
    int ser,i = 0;
    stud *p;

    p = head;

    printf("\n請輸入要尋找第幾個(從0開始):");
    scanf("%d",&ser);

    while(i != ser && i <= n){//此處不能寫爲i<n,
        //不然最後一個元素將沒法查找到
        i++;
        p = p->next;
    }
    if(i==n)
        printf("沒找到\n");
    else{
        printf("已經找到,你要的信息是:\n");
        printf("%s\n",p->name);
    }
}
stud *delete(stud *head,int n)
{
    stud *p,*s;
    int del, i = 0;
    p = head;

    printf("請輸入你要刪除的信息的序號:");
    scanf("%d",&del);

    while(i != del && i <= n){//此處不能寫爲i<n,
        //不然最後一個元素將沒法查找到
        s = p;
        i++;
        p = p->next;
    }
    if(i==n)
        printf("沒找到\n");
    else{
        printf("已經找到,你要刪除的信息是:\n");
        printf("%s\n",p->name);

        /*開始刪除*/
        if(i == 0){ //說明刪除的是頭節點
            head = p->next;
            head->prior = NULL; 
        }
        else{
            s->next = p->next;
            s->prior = p->prior;
        }

        printf("刪除成功\n");
        free(p);
        n--;
    }

    return head;
}

stud *insert(stud *head,int n)
{
    stud *p,*s;
    p = head;
    int ser,i = 0;
    char ins[20];
    char p_temp[20];

    printf("\n請輸入你要插入的信息:");
    scanf("%s",ins);

    s = (stud *) malloc (sizeof(stud));
    strcpy(s->name,ins);

    printf("\n請輸入要插入***的後面:");
    scanf("%d",&ser);

    while(i != ser){//此處不能寫爲i<n,
        //不然最後一個元素將沒法查找到
        i++;
        p = p->next;
    }
    if(i==n)
        printf("沒找到\n");
    else{
        printf("已經找到,你要的信息是:\n");
        printf("%s\n",p->name);
        printf("----------\n");
    }
    s->next = p->next;
    //printf("p->next->name = %s\n",p->next->name);
    //printf("s->next->name = %s\n",s->next->name);
    p->next->prior = s;
    //printf("p->next->prior->name = %s\n",p->next->prior->name);
    s->prior = p; //負責鏈接
    //printf("p->prior->name = %s\n",p->prior->name);
    p->next = s;//負責鏈接
    //printf("p->next->name = %s\n",p->next->name);

    //printf("\np->next->prior->name = %s\n",p->next->prior->name);
    //printf("p->prior->next->name = %s\n",p->prior->next->name);
    //printf("p->next->name = %s\n",p->next->name);
    //printf("p->prior->name = %s\n",p->prior->name);
    p = head;
    while(p != NULL){
        printf("\n------------print--------\n");
        printf("%4s\n",p->name);
        p = p->next;
    }
    free(p);

    return head;
}

在插入這裏我想理順一下,在各大博客、論壇上,全部的插入都長一個樣,索性本身畫了一個長得不同的(電腦畫太麻煩了,手繪,不喜勿噴哈) 
1.s->next = p->next; 
2.p->next->prior = s; 
3.s->prior = p; 
4.p->next = s;  spa

相關文章
相關標籤/搜索