使用C语言实现单链表

来源:互联网 发布:关于域名说法正确的是 编辑:程序博客网 时间:2024/06/05 19:02

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;
}

原创粉丝点击