码迷,mamicode.com
首页 > 其他好文 > 详细

复习下C 链表操作(双向链表)

时间:2014-11-26 18:35:52      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   sp   for   on   div   

双向链表 创建、删除、反转、插入

 //struct
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/**********************双向链表************************************/

typedef struct Student_Double
{
    char name[10];
    int  point;
    struct Student_Double *preStu;
    struct Student_Double *nextStu;
} StudentDouble;

//创建双向链表
StudentDouble *CreateDoubleLinkTable(void){
    int i = 0;
    StudentDouble *head = NULL;
    head = (StudentDouble *)malloc(sizeof(StudentDouble));
    head->name[0]=\0;
    head->point = 0;
    head->preStu = NULL;
    head->nextStu = NULL;
    
    StudentDouble *temp,*currentNode;
    currentNode=head;
    while (i<=9) {
        temp = (StudentDouble *)malloc(sizeof(StudentDouble));
        strncpy(temp->name,"Node",sizeof(temp->name));
        temp->point = i;
        temp->preStu = currentNode;
        temp->nextStu = NULL;
        
        currentNode->nextStu = temp;
        
        currentNode = temp;
        i++;
    }

    
    return head;
}
//正序查询
StudentDouble * SelectDoubleLinkTableFormHead(StudentDouble *head){
    StudentDouble *endNode = NULL;
    StudentDouble *next = head->nextStu;
    if (next == NULL) {
        printf("查询失败,不是链式结构\n");
        exit(0);
    }
    
    int i =0;
    while (next) {
        printf("index %d; studentName is %s;  point is %d\n",i+1,next->name,next->point);
        if (next->nextStu == NULL) {
            endNode = next;
            printf("双向链表尾节点:%d \n",endNode->point);
        }
        next=next->nextStu;
        i++;
    }
    return endNode;
}
//反序查询
void SelectDoubleLinkTableFormEnd(StudentDouble *end){
 
    StudentDouble *pre = end->preStu;
    if (pre==NULL) {
        printf("查询失败,不是链式结构\n");
        exit(0);
    }
    pre = end;
    int i = 0;
    while (pre) {
        if (pre->name[0]==\0) {
            //头链
            break;
        }
        printf("index %d; studentName is %s;  point is %d\n",i+1,pre->name,pre->point);
        pre = pre->preStu;
        i++;
    }
}

//双向链表 插入节点  上一节点序号|插入节点名
StudentDouble *insertStudentDoubleLinkTable(StudentDouble *head,char *content){
    if (!content) {
        exit(0);
    }
    //分割字符串
    char *token;
    char nodeName[10];
    int  nodeIndex;
    token = strtok(content,"|");
    int i = 0;
    while (token != NULL) {
        if (i>0) {
            strncpy(nodeName,token,sizeof(char[10]));
        }else{
            nodeIndex = atoi(token);
        }
        token = strtok(NULL,"|");
        i++;
    }
    
    //查找节点
    StudentDouble *next = head->nextStu;
    if (next==NULL) {
        printf("不是链式结构");
        exit(0);
    }
    int search = 0;
    StudentDouble *searchNode = NULL;
    while (next) {
        if (next->point == nodeIndex) {
            search = 1;
            searchNode = next;
        }
        next = next->nextStu;
    }
    if (search==0) {
        printf("没有找到节点序号为%d 的节点",nodeIndex);
        exit(0);
    }
    //插入节点
    StudentDouble *nextLinkTable = searchNode->nextStu;
    //创建新节点
    StudentDouble *new = (StudentDouble *)malloc(sizeof(StudentDouble));
    strncpy(new->name,nodeName,sizeof(new->name));
    new->point = 100;//这两随机去的数。
    new->preStu = searchNode;
    new->nextStu = nextLinkTable;
    
    searchNode->nextStu = new;
    
    return head;
}

//双向链表  删除节点
StudentDouble *DelegateDoubleLinkTable(StudentDouble *head,int nodeIndex){
    //查找节点
    StudentDouble *next = head->nextStu;
    if (next==NULL) {
        printf("不是链式结构");
        exit(0);
    }
    int search = 0;
    StudentDouble *searchNode = NULL;
    while (next) {
        if (next->point == nodeIndex) {
            search = 1;
            searchNode = next;
        }
        next = next->nextStu;
    }
    if (search==0) {
        printf("没有找到节点序号为%d 的节点",nodeIndex);
        exit(0);
    }

    StudentDouble *preNode = searchNode->preStu;
    StudentDouble *nextNode = searchNode->nextStu;
    
    preNode->nextStu = nextNode;
    nextNode->preStu = preNode;
    
    //释放
    free(searchNode);
    return head;
}


int main(void){
    char sf[15];
    int num;
 /**
     *  创建双向循环链表
     */
    StudentDouble *head = NULL;
    StudentDouble *end = NULL;
    printf("开始创建双向链表Y|N \n");
    scanf("%s",sf);
    if (strcmp(sf,"Y")==0) {
       head = CreateDoubleLinkTable();
    }
    printf("正序查询双向链表Y|N \n");
    scanf("%s",sf);
    if (strcmp(sf,"Y")==0) {
      end = SelectDoubleLinkTableFormHead(head);
    }
    
    printf("反序查询双向链表Y|N \n");
    scanf("%s",sf);
    if (strcmp(sf,"Y")==0) {
        printf("双向链表尾节点:%d \n",end->point);
        if (end->point == 9) {
            printf("双向链表反向查询\n");
            SelectDoubleLinkTableFormEnd(end);
        }
    }

    
    printf("插入双向链表 如:4(上一个节点序号)|name(要插入的节点名)\n");
    scanf("%s",sf);
    head = insertStudentDoubleLinkTable(head,sf);
    SelectDoubleLinkTableFormHead(head);
    
    printf("删除双向链表节点 输入要删除节点序号\n");
    scanf("%d",&num);
    head = DelegateDoubleLinkTable(head,num);
    SelectDoubleLinkTableFormHead(head);

    return 0;
}

 

反转:

 

复习下C 链表操作(双向链表)

标签:style   blog   io   ar   color   sp   for   on   div   

原文地址:http://www.cnblogs.com/tangbinblog/p/4123856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!