#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"List.h"
int main()
{
List list;
initLink(&list);
menu();
DATA item;
while (1)
{
int select = 0;
printf("选择想要的操作\n");
scanf("%d", &select);
switch (select)
{
case 1:
printf("输入push_back的数据:");
while (scanf("%d", &item), item != -1)
{
push_back(&list, item);
}
break;
case 2:
printf("输入push_front的数据:");
while (scanf("%d", &item), item != -1)
{
push_front(&list, item);
}
break;
case 3:
printf("删除元素:");
pop_front(&list);
break;
case 4:
printf("链表中的元素有:\n");
display(&list);
break;
case 5:
printf("输入查找元素:\n");
scanf("%d", &item);
Node* f = find(&list, item);
if (f==NULL)
{
printf("没有找到元素%d",item);
}
else
{
printf("找到元素:%d地址为:%p", f->data, f);
}
break;
case 6:
sort(&list);
printf("排序完成!!!");
break;
default:
break;
}
}
system("pause");
return 0;
}
void initLink(List* list)
{
list->size = 0;
list->front = NULL;
list->tail = NULL;
}
void menu()
{
printf("********[1]链表尾添加元素***********\n");
printf("********[2]链表头添加元素***********\n");
printf("********[3]删除元素*****************\n");
printf("********[4]显示元素*****************\n");
printf("********[5]查找元素*****************\n");
printf("********[6]冒泡排序*****************\n");
}
void push_back(List* list, DATA val)
{
Node* node = (Node*)malloc(sizeof(Node));
assert(node != NULL);
node->data = val;
node->next = NULL;
if (list->front!=NULL)
{
list->tail->next = node;
list->tail = node;
}
else
{
list->front = node;
list->tail = node;
list->size++;
}
}
void push_front(List* list, DATA val)
{
Node* node = (Node*)malloc(sizeof(Node));
assert(node != NULL);
node->data = val;
node->next = NULL;
if (list->front != NULL)
{
node->next = list->front;
list->front = node;
}
else
{
list->front = node;
list->tail = node;
list->size++;
}
}
void pop_front(List* list)
{
if (list->front==NULL)
{
return;
}
Node* delNode = list->front;
list->front = list->front->next;
free(delNode);
list->size--;
}
void pop_back(List* list)
{
if (list->front == NULL)
{
return;
}
if (size(list)==1)
{
free(list);
initLink(list);
}
else
{
Node* delNode = list->front;
Node* curNode = list->front;
Node* prevNode = list->front;
while (curNode!=NULL)
{
prevNode = curNode;
curNode = curNode->next;
}
free(curNode);
list->tail = prevNode;
list->tail->next = NULL;
}
Node* delNode = list->tail;
list->tail->next = list->tail;
free(delNode);
}
void display(List* list)
{
Node* curNode = list->front;
while (curNode!=NULL)
{
printf("%-2d", curNode->data);
curNode =curNode->next;
}
}
int size(List* list)
{
return list->size;
}
Node* find(List* list, DATA val)
{
if (list->front==NULL)
{
return NULL;
}
Node* curNode = list->front;
while (curNode!=NULL)
{
if (curNode->data==val)
{
return curNode;
}
curNode = curNode->next;
}
return NULL;
}
void sort(List*list)
{
if (size(list)<=1)
{
return;
}
for (Node* i = list->front->next; i->next != NULL; i = i->next)
{
for (Node* k = list->front; k->next != NULL; k = k->next)
{
if (k->data> k->next->data)
{
DATA temp = k->data;
k->data = k->next->data;
k->next->data = temp;
}
}
}
}
#pragma once
#ifndef __LIST_H
#define __LIST_H
typedef int DATA;
typedef struct Node_tag {
DATA data;
struct Node_tag* next;
}Node;
typedef struct List_tag {
int size;
Node* front;
Node* tail;
}List;
void initLink(List *list);
void menu();
void push_back(List* list, DATA val);
void display(List* list);
void push_front(List* list, DATA val);
void pop_front(List* list);
void pop_back(List* list);
Node* find(List* list, DATA val);
int size(List* list);
void sort(List* list);
#endif