some code of c

//
//  main.c
//  LineList
//
//  Created by Rubert on 16/9/11.
//  Copyright © 2016年 Study. All rights reserved.
//

#include <stdio.h>
//定义链表数据结构
struct node
{
    int num;
    struct node *next;
    struct node *prior;

};
//函数声明
struct node *create();
void print();
void linkedList();
void headInsertLinkedList();
void tailInsertLinkedList();
void findLinkedList();
void insertLinkedList();
void deleteLinkedList();
void circleInsertLinkedList();
void doubleInsertLinkedList();
int main(int argc, const char * argv[]) {
    // insert code here...
    //headInsertLinkedList();
    //tailInsertLinkedList();
    //findLinkedList();
    //insertLinkedList();
    //deleteLinkedList();
    //circleInsertLinkedList();
    doubleInsertLinkedList();
    return 0;
}


/*
 * 头插入法创建链表
 */
void headInsertLinkedList() {
    struct node *head = NULL;
    struct node *p1;
    for(int i = 1; i < 10; i ++) {
        p1 = (struct node*)malloc(sizeof(struct node));
        p1 -> num = i;
        p1 -> next = head;
        head = p1;
    }
    print(head);
}

/*
 * 尾插入法创建链表
 */
void tailInsertLinkedList() {
    struct node *head = NULL;
    struct node *p1,*p2;
    p1 = p2 = (struct node*)malloc(sizeof(struct node));
    for(int i = 1; i < 10; i ++) {
        if(head == NULL) {
            head = p1;
        } else {
            p2 -> next = p1;
        }
        p2 = p1;
        p1 = (struct node*)malloc(sizeof(struct node));
        p1->num = i;
    }
    print(head);
}


/**
 * 创建循环链表
 */
void circleInsertLinkedList() {
    struct node *head = NULL;
    struct node *p1,*p2;
    p1 = p2 = (struct node*)malloc(sizeof(struct node));
    for(int i = 1; i < 10; i ++) {
        if(head == NULL) {
            head = p1;
        } else {
            
            if(i == 9) {
                p1->next = head;
            }
            p2 -> next = p1;
        }
        p2 = p1;
        p1 = (struct node*)malloc(sizeof(struct node));
        p1->num = i;
        
    }
    print(head);
}

/**
 * 创建双向链表
 */
void doubleInsertLinkedList() {
    struct node *head = NULL;
    struct node *p1,*p2;
    p1 = p2 = (struct node*)malloc(sizeof(struct node));
    for(int i = 1; i < 10; i ++) {
        if(head == NULL) {
            head = p1;
        } else {
            /*if(i == 9) {
                p1->next = head;
            }*/
            p2 -> next = p1;
            p1 -> prior = p2;
        }
        p2 = p1;
        p1 = (struct node*)malloc(sizeof(struct node));
        p1->num = i;
        
    }
    print(head);
}

/*
 * 链表查找
 */
void findLinkedList() {
    
    struct node *head = NULL;
    struct node *p1;
    for(int i = 1; i < 10; i ++) {
        p1 = (struct node*)malloc(sizeof(struct node));
        p1 -> num = i;
        p1 -> next = head;
        head = p1;
    }
    
    struct node *p;
    p = head -> next;
    int j = 1;
    int i = 5;
    while(p !=NULL && j < i)
    {
        p = p->next;
        ++j;
    }
    printf("%6d %d %d\n",p->num, p, p->next);/*输出链表节点的值*/
}

/*
 * 链表中插入
 */

void insertLinkedList() {
    
    struct node *head = NULL;
    struct node *p1;
    for(int i = 1; i < 10; i ++) {
        p1 = (struct node*)malloc(sizeof(struct node));
        p1 -> num = i;
        p1 -> next = head;
        head = p1;
    }
    
    struct node *p,*m;
    p = head;
    int j = 0;
    int i = 5;
    while(p !=NULL && j < i-1)
    {
        p = p->next;
        ++j;
    }
    
    if(p == NULL) {
        printf("error");
    } else {
        m = (struct node*)malloc(sizeof(struct node));
        m->num = j;
        m->next = p -> next;
        p->next = m;
    }
    
    print(head);
    
}


/*
 * 链表中删除
 */

void deleteLinkedList() {
    
    struct node *head = NULL;
    struct node *p1;
    for(int i = 1; i < 10; i ++) {
        p1 = (struct node*)malloc(sizeof(struct node));
        p1 -> num = i;
        p1 -> next = head;
        head = p1;
    }
    
    struct node *p,*m;
    p = head;
    int j = 0;
    int i = 5;
    while(p !=NULL && j < i-2)
    {
        p = p->next;
        ++j;
    }
    
    if(p == NULL) {
        printf("error");
    } else {
        //m = (struct node*)malloc(sizeof(struct node));
        //m->num = j;
        //m->next = p -> next;
        p->next = p->next->next;
        
    }
    
    print(head);
    
}

/*
 * sample 1
 */
void linkedList()
{
    struct node *head;
    head = NULL;//创建一个空表
    head = create(head); /* 创建单链表 */
    print(head);/* 打印单链表 */
    
}


struct node *create(struct node *head) //返回的是与节点相同类型的指针
{
    struct node *p1,*p2;
    int i = 1;
    //利用malloc() 函数向系统申请分配一个节点
    p1 = p2 = (struct node*)malloc(sizeof(struct node));//新节点
    printf("请输入值,值小于等于0结束,值存放地址为:p1_ADDR= %d\n",p1);
    scanf("%d",&p1->num);/*输入节点的值*/
    p1->next=NULL;/*将新节点的指针置为空*/
    while(p1->num > 0)/*输入节点的数值大于0*/
    {
        //④将新节点的指针成员赋值为空。若是空表,将新节点连接到表头;若是非空表,将新节点接到表尾;
        if(head == NULL)
            head = p1;/*空表,接入表头*/
        else
            p2->next = p1;/*非空表,接到表尾*/
        p2 = p1;
        
        p1 = (struct node*)malloc(sizeof(struct node));/*下一个新节点*/
        i = i+1;
        printf("请输入值,值小于等于0结束,值存放地址为:p%d_ADDR= %d\n",i,p2);
        scanf("%d",&p1->num);/*输入节点的值*/
        //⑤判断一下是否有后续节点要接入链表,若有转到3 ),否则结束;
    }
    //==============原来程序更正部分:(多谢@daling_datou提醒)================================
    //free(p1);  //申请到的没录入,所以释放掉
    p1 = NULL;   //使指向空
    p2->next = NULL; //到表尾了,指向空
    printf("链表输入结束(END)\n");
    //==============================================
    return head;
}




void print(struct node *head)/*出以head为头的链表各节点的值*/
{
    struct node *temp;
    temp = head;/*取得链表的头指针*/
    
    printf("\n\n\n链表存入的值为:\n");
    while(temp != NULL)/*只要是非空表*/
    {
        printf("%6d %d %d %d\n",temp->num, temp, temp->next, temp->prior);/*输出链表节点的值*/
        temp = temp->next;/*跟踪链表增长*/
    }
    printf("链表打印结束!!");
}

 

posted on 2016-10-06 11:27  洛易  阅读(210)  评论(0编辑  收藏  举报