/*
* 单链表的创建及其运算
* 2018.10.23
* @L.F
*
* */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int DataType_t;//结点的数据类型为DataType_t,这里是Int型
typedef struct Node //结点类型的定义
{
DataType_t Data; //结点的数据域类型
struct Node *Next; //结点的指针域类型
}LinkList;
LinkList *LinkListCreate() //创建一个空的链表
{
LinkList *h = (LinkList *)malloc(sizeof(LinkList)); //创建一个头结点
h->Next = NULL; //初始化结构体
return h;
}
void LinkListInsertHead(LinkList *h, DataType_t Value)//头插法插入数据
{
LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申请空间并赋值
Temp->Data = Value;
Temp->Next = h->Next;//将头结点的下一个结点的地址保存在新插入结点的指针域里面
h->Next = Temp;//将新插入的结点的地址保存在头结点的指针域里面
return ;
}
void LinkListInsertTail(LinkList *h, DataType_t Value)//尾插法插入数据
{
LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申请空间并赋值
Temp->Data = Value;
while(h->Next != NULL)//找到最后一个结点
{
h = h->Next;
}
Temp->Next = NULL;
h->Next = Temp;
return ;
}
void LinkListInsertPos(LinkList *h, int pos, DataType_t Value)//按照位置插入数据
{
LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));
Temp->Data = Value;
int i =1;
while(h->Next != NULL && i<= pos)
{
h = h->Next;
i++;
}
if(h->Next == NULL)
{
printf("位置出错\n");
}
else
{
Temp->Next = h->Next;
h->Next = Temp;
}
return ;
}
void LinkListInsertSort(LinkList *h, DataType_t Value)//按照顺序插入(自带排序功能)
{
LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));
Temp->Data = Value;
while(h->Next != NULL && h->Next->Data < Temp->Data)
{
h = h->Next;
}
Temp->Next = h->Next;
h->Next = Temp;
return ;
}
DataType_t LinkListDeleteHead(LinkList *h)//头删法删除数据
{
/*h->Next = h->Next->Next;//只删除*/
/*
* DataType_t Value;
* Value = h->Next->Data;
* h->Next = h->Next->Next;
* */
/*释放删除结点*/
DataType_t Value;
LinkList *Temp = h->Next;
Value = h->Next->Data;
h->Next = h->Next->Next;
free(Temp);
Temp = NULL;
return Value;
}
int LinkListUpdata(LinkList *h, DataType_t OldValue, DataType_t NewValue)//按照数据修改数据
{
while(h->Next != NULL)
{
if(h->Next->Data == OldValue)
{
h->Next->Data = NewValue;
return 0;
}
h = h->Next;
}
printf("%d 是不存在的", NewValue);
return -1;
}
int LinkListSearch(LinkList *h,DataType_t Value)//按照数据查找位置
{
int pos = 0;
while(h->Next != NULL)
{
if(h->Next->Data == Value)
{
return pos;
}
h = h->Next;
pos++;
}
printf("%d 不存在\n", Value);
return -1;
}
void LinkListReverse(LinkList *h)//实现链表的翻转
{
LinkList *p = h->Next;
LinkList *q;
h->Next = NULL;
while(p != NULL)
{
q = p;
p = p->Next;
q->Next = h->Next;
h->Next = q;
}
return ;
}
void LinkListShow(LinkList *h)//打印数据
{
while(h->Next != NULL)
{
h = h->Next;
printf(" %d", h->Data);
}
putchar(10);
}
int main(int argc, const char *argv[])
{
LinkList *h = LinkListCreate();
int F,s,i,a,n;
while(1)
{
printf("请输入您的需求: 1.头插法插入数据 2.尾插法插入数据 3.按照位置插入数据\n");
printf(" 4.按照顺序插入数据 5.头删法删除数据 6.按照数据修改数据\n");
printf(" 7.按照数据查找位置 8.实现链表的翻转\n");
scanf("%d", &F);
switch(F)
{
case 1:
printf("请输入您要插入的数据个数:");
scanf("%d",&s);
for(i=0; i<s;i++)
{
printf("请输入您要插入的数据:");
scanf("%d", &a);
LinkListInsertHead(h,a);
}
LinkListShow(h);
break;
case 2:
printf("请输入您要插入的数据个数:");
scanf("%d",&s);
for(i=0; i<s;i++)
{
printf("请输入您要插入的数据:");
scanf("%d", &a);
LinkListInsertTail(h,a);
}
LinkListShow(h);
break;
case 3:
printf("请输入您要插入数据的位置: ");
scanf("%d", &n);
printf("请输入您要插入的数据: ");
scanf("%d", &a);
LinkListInsertPos(h, n, a);
LinkListShow(h);
break;
case 4:
printf("请输入要插入的数据个数: ");
scanf("%d",&s);
for(i=0; i<s;i++)
{
printf("请输入要插入的数据:");
scanf("%d", &a);
LinkListInsertSort(h, a);
}
LinkListShow(h);
break;
case 5:
LinkListDeleteHead(h);
LinkListShow(h);
break;
case 6:
printf("请输入需要修改的数据:");
scanf("%d", &a);
printf("请输入修改为的数据: ");
scanf("%d", &n);
LinkListUpdata(h, a, n);
LinkListShow(h);
break;
case 7:
printf("请输入您要查找位置的数据: ");
scanf("%d",&a);
printf("所查数据的位置为%d \n", LinkListSearch(h,a));
break;
case 8:
LinkListShow(h);
LinkListReverse(h);
LinkListShow(h);
break;
default:
break;
}
}
return 0;
}