第十天

顺序表:

顺序表的结构:

typedef struct sqlist{

int data[size];

int length;

}

链表:单向链表 双向链表

单向链表:

typedef struct  linkList{

int data;

struct linkList *next;

}linkList;


双向链表:

typedef struct DlinkList{

int data;

struct DlinkList* next;

struct  Dlinklist *prev;

}DlinkList;


Dlinklist *create_dlinklist(int data){

创建dlinllist指针。

用malloc分配空间

初始化

返回



双向循环链表:





练习:

1.用单向链表实现数据1》2》3》4》5倒序5》4》3》2》1

//不产生更多空间的情况下,把数据倒序。主要方法是把一个数据删除然后再把数据插入进去,删除第二个数据再把数据放进去,就会变成2》1》3》4》5,如此类推,最后会变成

5》4》3》2》1,记得删除数据后因为还需要使用所以不能free掉,运用到的是头插法。

head->1->2->3->4->5     linkliest*p=head->next ;linklist*p=head->next;现在p和q都指向1,head->next=null;把head断开,然后p->next!=null; q=p-next;把q指向2 ;现在要把1和head连起来,所以p->next=head->next;不能写直接等于null,因为为了接下来的也能用,保证通用性,head->next=p;再把p=q 就是把q移到2的地方,当p->next==null的时候还需要把最后一个删除然后放到第一个,所以循环外还需要把p->next=head->next;head->next=p;

linklist *p=head->next;
linklist *p=head->next;
head->next=NULL;

while(p->next!=NULL){
       q=p->next;
       p->next=head->next;//空 ,null
       head->next=p;
}
//最后一个数
p->next=head->next;
head->next=p;





下面的方法不值得做,因为多了一个链表

.c文件

//
//  linklist.c
//  
//
//  Created by FD on 15/11/5.
//
//

#include "linklist.h"
linklist *create_linklist(int data){
    linklist *new=(linklist *)malloc(sizeof(linklist));
    new->data=data;
    new->next=NULL;
    return new;
}
void display_linklist(linklist *head){
    if (head==NULL) {
        printf("error,null\n");
       
    }
    head=head->next;
    while (head!=NULL) {
        printf("%d\n",head->data);
        head=head->next;
    }
}
bool insert_linklist(linklist *head,int data){
    if (head==NULL) {
        printf("null");
        return false;
    }
//    linklist *new=head;
//    new->next=head->next;
//    head->next=new;
//    new->data=data;
//    return true;
  
    while (head->next!=NULL) {
        head=head->next;
    }
    linklist *new=create_linklist(data);
    if (new==NULL) {
        return false;
    }
    head->next=new;
    return true;
    
}
//bool insert_linklisthead(linklist * head){
//    if (head==NULL) {
//        printf("error\n");
//        return false;
//    }
//    linklist *new=create_linklist();
//    
//}
bool insert_linklisthead(linklist *head,int data){
    if (head==NULL) {
        printf("error,null");
        return false;
    }
    linklist *new=create_linklist(data);
//    if (head->next==NULL) {
//        head->next=new;
//        return true;
//    }
    new->next=head->next;
    head->next=new;
    return true;
    
}

//void reverse_linklist(linklist *head){
//    
//    //printf("2");
//    
//    //linklist *new=head;
//    if (head==NULL) {
//        printf("error");
//    }
//    linklist *new=head;
//    new=new->next;
//    linklist *new1;
//  
//    while (new!=NULL) {
//       // printf("1");
//       bool c=insert_linklisthead(new,new->data);
//        new=new->next;
//    }
//
//   // printf("%d",new->data);
//    
//
//}
int main(){
    linklist *return_element=create_linklist(0);
    for (int i=1;i<=5 ;i++) {
        bool b=insert_linklist(return_element,i);
    }
    display_linklist(return_element);
    linklist *new=create_linklist(0);
    return_element=return_element->next;
    while (return_element!=NULL) {
        bool c=insert_linklisthead(new,return_element->data);
        return_element=return_element->next;
    }
    printf("---------------------------\n");
//    new=new->next;
    display_linklist(new);
//    while (new!=NULL) {
//        printf("%d",new->data);
//        new=new->next;
//    }
    
//    printf("%d",return_element->data);
   // printf("%d",return_element->next->data);
   // display_linklist(new);
    //printf("2");
//    reverse_linklist(return_element);
    
    
    
    
}
.h文件

//
//  linklist.h
//  
//
//  Created by FD on 15/11/5.
//
//

#ifndef linklist_h
#define linklist_h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct linklist{
    int data;
    struct linklist *next;
}linklist;
linklist *create_linklist(int data);
bool insert_linklist(linklist *head,int data);
void display_linklist(linklist *head);
void reverse_linklist(linklist *head);
bool insert_linklisthead(linklist *head,int data);
#endif /* linklist_h */



2.用双向循环链表保存20个随机数,并且把随机数的奇数和偶数分别输出。(从头遍历一次,再从尾到头遍历一次)

用%运算符来求奇数偶数。

.c文件

//
//  DlinkList.c
//  
//
//  Created by FD on 15/11/5.
//
//

#include <stdio.h>
#include<time.h>
#include <sys/time.h>
#include "DlinkList.h"
DlinkList *created_dlinklist(int data){
    DlinkList *new=(DlinkList*)malloc(sizeof(DlinkList));
    new->data=data;
    new->prev=NULL;
    new->next=NULL;
    return new;
}
//尾插法
bool insert_dlinklist(DlinkList *head,int data){
    if (head==NULL) {
        printf("null\n");
        return false;
    }
    while (head->next!=NULL) {
        head=head->next;
    }
    DlinkList *new=created_dlinklist(data);
    head->next=new;
    new->prev=head;
    return true;
    
}
//头插法
bool insert_dlinklisthead(DlinkList *head,int data){
    if (head==NULL) {
        printf("null\n");
        return false;
    }
    DlinkList *new=created_dlinklist(data);
    if (head->next==NULL) {
        head->next=new;
        new->prev=head;
        return true;
    }
    new->next=head->next;
    new->prev=head;
    head->next->prev=new;
    head->next=new;
    return true;
    
}
//显示
void display_dlinklist(DlinkList *head){
    if (head==NULL) {
        printf("null\n");
    }
    head=head->next;
    printf("even:\n");
    while (head!=NULL) {
        if ((head->data)%2==0) {
            printf("%d\n",head->data);
        }
        
        head=head->next;
    }
    
    
}
void show(DlinkList *head){
    if (head==NULL) {
        printf("null");
    }
    head=head->next;
    printf("odd:\n");
    while (head!=NULL) {
        if ((head->data)%2!=0) {
            printf("%d\n",head->data);
        }
        head=head->next;
    }
}
//删除
bool delete_Dlinklist(DlinkList *head,int data){
    if (head==NULL) {
        printf("null\n");
    }
    
    while (head->next!=NULL) {
        if (head->next->data==data) {
            break;
        }
        head=head->next;
    }
    if (head->next==NULL) {
        return false;
    }
    // p不是最后一个节点
    DlinkList *needf=head->next;
    head->next=needf->next;
    needf->next->prev=head;
    free(needf);
    return true;
}

int main(){
    DlinkList *new=created_dlinklist(0);
    for (int i=0; i<20; i++) {
        struct timeval tval;
        gettimeofday(&tval,NULL);
        srandom(tval.tv_usec);
        int randomnumber=random()%100;
        bool insert=insert_dlinklist(new,randomnumber);
    }
    display_dlinklist(new);
    show(new);
    return 0;
}

/*
main.c
a.c
多文件编译:gcc main a.c main.c
*/
//int main(){
//    DlinkList *new=created_dlinklist(0);
//    for (int i=0; i<10; i++) {
//        bool insert=insert_dlinklist(new,i);
//    }
//    display_dlinklist(new);
//    return 0;
//    
//    
//    
//    
//}

.h文件

//
//  DlinkList.h
//  
//
//  Created by FD on 15/11/5.
//
//

#ifndef DlinkList_h
#define DlinkList_h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct DlinkList{
    int data;
    struct DlinkList* prev;
    struct DlinkList* next;
}DlinkList;
DlinkList *created_dlinklist(int data);
bool insert_dlinklist(DlinkList *head,int data);
bool insert_dlinklisthead(DlinkList *head,int data);
void display_dlinklist(DlinkList *head);
bool delete_Dlinklist(DlinkList *head,int data);
#endif /* DlinkList_h */



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值