您的位置:首页 > 其它

[I0A]链表-单链表

2016-02-24 14:54 316 查看
链表,分为单链表,双链表,循环链表。只要掌握基本的单链表后面两种非常轻松就可以解决。

什么是单链表?

链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

┌───┬───┐ ┌───┬───┐ ┌───┬───┐

│data │next │---> │data │next │--->│data │next │

└───┴───┘ └───┴───┘ └───┴───┘

data域--存放结点值的数据域

next域--存放结点的直接后继的地址(位置)的指针域(链域)

typedef struct node node;

struct node{
int element;
node* next;
};

typedef struct {
node *head;
int size;
}linked_list;


这是一个包含单链表的基本定义。

单链表的创建:

linked_list create_list(){
node* n = create_node(INT_MIN);
linked_list list = {n,0};
return list;
}

node* create_node(int element){
node* n = malloc(sizeof(node));
n->element = element;
n->next = NULL;
return n;
}


这是一个包含空头结点的单链表,之所以包含空头结点 是为了简化操作。

主要讲解,单链表的删除和插入过程,因为该两种过程是所有操作的基础。

删除:



插入:



#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

typedef struct node node; struct node{ int element; node* next; }; typedef struct { node *head; int size; }linked_list;
node*
create_node(int element);

linked_list
create_list();

void
append(linked_list* list,int element);

node*
search(linked_list list,int element);

void
sort(linked_list* list);

void
print_list(linked_list list);

void
menu();

void
list_test();

void
clear_list(linked_list* list);

void
delete(linked_list* list,int element);

node*
find_less_than(linked_list list,int element);

int main(int argc,char** argv){
list_test();
return 0;
}

void delete(linked_list* list,int element){
node *ptr = search(*list,element);
//node *ptr = list->head;
//while(ptr->next && ptr->next->element != element) ptr = ptr->next;
if(ptr->next){
node* tmp = ptr->next;
ptr->next = ptr->next->next;
free(tmp);
list->size--;
}
}

void clear_list(linked_list* list){
node *n = list->head;
while(n){
list->head = n->next;
free(n);
n = list->head;
}

}

void list_test(){
linked_list list = create_list();
int element,choice;
while(1){
menu();
print_list(list);
printf("input choice:");
scanf("%d",&choice);
switch(choice) {
case 1:{printf("input number:");scanf("%d",&element);append(&list,element);break;}
case 2:{printf("input number:");scanf("%d",&element);node *n = search(list,element);if(n->next) printf("element exists\n");break;}
case 3:{sort(&list);break;}
case 4:{printf("input number:");scanf("%d",&element);delete(&list,element);break;}
case 5:{clear_list(&list);exit(0);}
default:break;
}
getchar();
}
}

node* find_less_than(linked_list list,int element){
node *ptr = list.head;
while(ptr->next && ptr->next->element < element) ptr = ptr->next;
return ptr;
}

void menu(){
system("clear");
printf("Linked List Test\n");
printf("1.append\n");
printf("2.search\n");
printf("3.sort\n");
printf("4.delete\n");
printf("5.exit\n");
}

void print_list(linked_list list){
node* n = list.head->next;
while(n){
printf("%d\t",n->element);
n = n->next;
}
printf("\n");
}

void sort(linked_list *list){
node *ptr = list->head->next;
list->head->next = NULL;
while(ptr){
node* n = ptr;
node *tmp = find_less_than(*list,n->element);
ptr = ptr->next;
n->next = tmp->next;
tmp->next = n;
}
}

node* search(linked_list list,int element){
node *ptr = list.head;
while(ptr->next && ptr->next->element != element) ptr = ptr->next;
return ptr;
}

void append(linked_list* list,int element){
node *ptr = list->head;
while(ptr->next!=NULL) ptr = ptr->next;
ptr->next = create_node(element);
list->size++;
}

linked_list create_list(){ node* n = create_node(INT_MIN); linked_list list = {n,0}; return list; } node* create_node(int element){ node* n = malloc(sizeof(node)); n->element = element; n->next = NULL; return n; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: