您的位置:首页 > 编程语言 > C语言/C++

使用C语言实现单链表

2017-09-16 19:33 239 查看
List.h文件

#ifndef __LIST_H__

#define __LIST_H__

#include<stdio.h>

#include<stdlib.h>

#include<assert.h>

typedef int Data;

typedef struct List

{
Data arrary;
struct List* next;

}List;

List* BuyList(Data x);                                                                       //动态开辟结构体

void PrintList(List* phead);                                                            //打印结构体

void PushBack(List** pphead, Data x);                                       //在尾部插入数据

void PopBack(List** pphead);                                                       //删除尾部数据

void PushFront(List** pphead, Data x);                                      //在头部插入数据

void PopFront(List** pphead);                                                      //删除头部数据      

 

List* Find(List* phead, Data x);                                                    //查找指定数据

void Insert(List** pphead, List* pos, Data x);                            //在指定数字的位置前插入数据

void Easer(List** pphead, List* pos);                                        //删除指定数字      

#endif

List.c文件

#include"List.h"

List* BuyList(Data x)

{
List* node = (List*)malloc(sizeof(List));
node->next = NULL;
node->arrary = x;
return node;

}

void PushBack(List** pphead,Data x)

{
if (*pphead == NULL)
{
*pphead = BuyList(x);
}
else
{
List* tail = *pphead;
while (tail->next)
{
tail = tail->next;
}
tail->next = BuyList(x);
}

}

void PopBack(List** pphead)

{
if (*pphead == NULL)
{
return;
}
else if ((*pphead)->next == NULL)
{
free(*pphead);
*pphead = NULL;
}
else
{
List* tail = *pphead;
List* prev = NULL;
while (tail->next)
{
prev = tail;
tail = tail->next;
}
prev->next = NULL;
free(tail);
}

}

void PushFront(List** pphead,Data x)

{
if ((*pphead) == NULL)
{
*pphead = BuyList(x);
}
else
{
List* start = *pphead;
start = BuyList(x);
start->next = *pphead;
*pphead = start;
}

}

void PopFront(List** pphead)

{
if (*pphead == NULL)
{
return;
}
else if ((*pphead)->next==NULL)
{
*pphead = NULL;
free(*pphead);
}
else
{
List* start = (*pphead)->next;
free(*pphead);
*pphead = start;
}

}

List* Find(List* phead,Data x)

{
assert(phead);

while (phead)
{
if (phead->arrary == x)
{
return phead;
}
phead = phead->next;
}
return NULL;

}

void Insert(List** pphead, List* pos, Data x)

{
assert(pos);
if (*pphead == NULL)
{
*pphead = BuyList(x);
}
else if (*pphead==pos)
{
List* Start = BuyList(x);
Start->next = *pphead;
*pphead = Start;
}
else
{
List* Start = *pphead;
while (Start->next!=pos)
{
Start = Start->next;
}
List* Node = BuyList(x);
Start->next = Node;
Node->next = pos;
}

}

void Easer(List** pphead, List* pos)

{
assert(pos);
List* Start = *pphead;
if ((pos->next == NULL) && (pos!=*pphead))
{
while (Start->next != pos)
{
Start = Start->next;
}
Start->next = NULL;
free(pos);
}
else if (pos == *pphead)
{
*pphead = pos->next;
pos->next = NULL;
}
else
{
while (Start->next != pos)
{
Start = Start->next;
}
Start->next = pos->next;
pos->next = NULL;
free(pos);
}

}

void PrintList(List* phead)

{
List* start = phead;
while (start)
{
printf("%d ", start->arrary);
start = start->next;
}
printf("\n");

}

test.c文件

#include"List.h"

void menu()

{
printf("** 1.尾增               2.尾删 **\n");
printf("** 3.头增               4.头删 **\n");
printf("** 5.插入               6.删除 **\n");
printf("** 7.打印               0.退出 **\n");

}

int main()

{
List* phead = NULL;
Data x = 0;
while (1)
{
int input = 0;
List* pos = NULL;
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入你要插入的数字:");
scanf("%d", &x);
PushBack(&phead, x);
break;
case 2:
PopBack(&phead);
break;
case 3:
printf("请输入你要插入的数字:");
scanf("%d", &x);
PushFront(&phead, x);
break;
case 4:
PopFront(&phead);
break;
case 5:
printf("请输入你要插入的数字:");
scanf("%d", &x);
int i = 0;
printf("请选择您要插入的位置所在的数字值:");
scanf("%d", &i);
pos = Find(phead, i);
Insert(&phead, pos, x);
break;
case 6:
printf("请输入你要删除的数字:");
scanf("%d", &x);
pos = Find(phead, x);
Easer(&phead, pos);
break;
case 7:
PrintList(phead);
break;
case 0:
return;
default:
printf("输入错误,请重新输入\n");
break;
}
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: