顺序表:
顺序表的结构:
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 */