单链表的头文件
#pragma once
#include"common.h"
#define SList_ElemType int
//单链表节点
typedef struct SListNode
{
SList_ElemType data; //数据域
struct SListNode* next; //指针域
}SListNode;
typedef SListNode* SList; //单链表类型
//函数声明
//SList* ph 通 SList* phead表示头指针的意思·
void SListInit(SList* ph);
void SListPushBack(SList* ph, SList_ElemType x);
void SListPushFront(SList* ph, SList_ElemType x);
void SListPopBack(SList* ph);
void SListPopFront(SList* ph);
SListNode* SListFind(SList ph, SList_ElemType key);
void SListDeleteByVal(SList* ph, SList_ElemType key);
int SListLength(SList ph);
void SListInsertByVal(SList* ph, SList_ElemType x);
void SListClear(SList* ph);
void SListReverse(SList* ph);
void SListSort(SList* ph);
void SListShow(SList ph);
void SListDestroy(SList* ph);
//函数定义
void SListInit(SList* ph)
{
assert(ph != NULL);
*ph = NULL;
}
//显示链表
void SListShow(SList ph)
{
while (ph != NULL)
{
printf("%d->", ph->data);
ph = ph->next;
}
printf("Over\n");
}
//尾插
void SListPushBack(SList* ph, SList_ElemType x)
{
assert(ph != NULL);
SListNode* S = (SListNode*)malloc(sizeof(SListNode));
assert(S != NULL);
S->data = x;
S->next = NULL;
if (*ph == NULL)
{
*ph = S;
}
else
{
SListNode* p = *ph;
while (p->next != NULL)
p = p->next;
p->next = S;
}
}
//头插
void SListPushFront(SList* ph, SList_ElemType x)
{
assert(ph != NULL);
SListNode* S = (SListNode*)malloc(sizeof(SListNode));
assert(S != NULL);
S->data = x;
S->next = NULL;
if (*ph == NULL)
{
*ph = S;
}
else
{
S->next = *ph;
*ph = S;
}
}
//按值插入
void SListInsertByVal(SList* phead, SList_ElemType x)
{
//申请节点
SListNode* s = (SListNode*)malloc(sizeof(SListNode));
assert(s != NULL);
s->data = x;
s->next = NULL;
//查找插入位置
SListNode* p = *phead, * prev = NULL;
while (p != NULL && x > p->data)
{
prev = p;
p = p->next;
}
//插入节点
if (*phead == NULL)
*phead = s;
else
{
if (prev == NULL)
{
s->next = *phead;
*phead = s;
}
else
{
s->next = prev->next;
prev->next = s;
}
}
}
/*
void SListInsertByVal(SList * ph, SList_ElemType x)
{
assert(ph != NULL);
SListNode* pre = NULL;
SListNode* p = *ph;
SListNode* S = (SListNode*)malloc(sizeof(SListNode));
assert(S!= NULL);
S->data = x;
S->next = NULL;
while (p!=NULL && p->data < x)
{
pre = p;
p = p->next;
}
if (*ph == NULL)
{
*ph = S;
}
else
{
if (pre == NULL)
{
S->next=p;
*ph = S;
}
else
{
pre->next = S;
S->next = p;
}
}
}*/
//尾删
void SListPopBack(SList* ph)
{
assert(ph != NULL);
SListNode* pre = NULL;
SListNode* p = *ph;
while (p->next!=NULL)
{
pre = p;
p = p->next;
}
if (pre == NULL)
*ph = NULL;
else
pre->next = NULL;
free(p);
}
//头删
void SListPopFront(SList* ph)
{
assert(ph != NULL);
SListNode* p = *ph;
if (p->next == NULL)
{
*ph = NULL;
free(p);
}
else
{
*ph = p->next;
free(p);
}
}
//按值删除
void SListDeleteByVal(SList* ph, SList_ElemType x)
{
SListNode* p = *ph;
SListNode* prev = NULL;
//查找节点
while (p != NULL && p->data != x)
{
prev = p;
p = p->next;
}
//删除节点
if (p != NULL)
{
if (prev == NULL) //判断删除节点是否为第一个节点
*ph = p->next;
else
prev->next = p->next;
}
free(p);
}
/*assert(ph != NULL);
SListNode* p = *ph;
SListNode* pre = NULL;
while(p!=NULL && p->data!=x)
{
pre = p;
p=p->next;
}
if (p == NULL)
return;
else
pre->next = p->next;
free(p);*/
//查找
SListNode* SListFind(SList ph, SList_ElemType x)
{
assert(ph != NULL);
SListNode* p = ph;
while(p != NULL && p->data != x)
{
p = p->next;
}
return p;
}
//求长度
int SListLength(SList ph)
{
assert(ph != NULL);
SListNode* p = ph;
SList_ElemType count = 0;
while (p!=NULL)
{
p = p->next;
count++;
}
return count;
}
//链表清除
void SListClear(SList* ph)
{
if (*ph == NULL)
return;
while (*ph != NULL)
{
SListNode* p = *ph;
*ph = p->next;
free(p);
}
printf("销毁完毕\n");
}
//链表排序
void SListSort(SList* ph)
{
assert(ph != NULL);
if ((*ph) == NULL || (*ph)->next == NULL)
return;
SListNode* p = (*ph)->next;
(*ph)->next = NULL;
while (p != NULL)
{
SListNode* q = p->next;
if (p->data < (*ph)->data)
{
p->next = (*ph) ;
(*ph) = p;
}
else
{
SListNode* pre = *ph;
while (pre->next != NULL && pre->next->data < p->data)
pre = pre->next;
p->next = pre->next;
pre->next = p;
}
p = q;
}
}
//排序只能拍一个
/*
void SListSort(SList* ph)
{
assert(ph != NULL);
SListNode* p = *ph;
SListNode* pre = NULL;
SList_ElemType x = 0;
SListNode* q = p;
while (q!=NULL)
{
q= q->next;
while (p != NULL)
{
if (p->next == NULL)
return;
pre = p;
p = p->next;
if (pre->data > p->data)
{
x = pre->data;
pre->data = p->data;
p->data = x;
}
}
p = q;
}
}*/
//链表的逆置
void SListReverse(SList* ph)
{
assert(ph != NULL);
if ((*ph) == NULL || (*ph)->next == NULL)
return;
SListNode* p = (*ph)->next;
SListNode* q = (*ph)->next;
(*ph)->next = NULL;
while (p != NULL)
{
q = p->next;
p->next = *ph;
*ph = p;
p = q;
}
}
//摧毁
void SListDestroy(SList* ph)
{
SListClear(ph);
}
2.
主函数对各个功能的调用
#include"S_List.h"
int main()
{
SList mylist;
SListInit(&mylist);
int Select = 0;
int pos = 0;
int x = 0;
SListNode* p;
while (1)
{
printf("**************************************\n");
printf("*[1] PushBack [2] PushFront *\n");
printf("*[3] ShowList [4] Length *\n");
printf("*[5] PopBack [6] PopFront *\n");
printf("*[7] Insert_Val [8] Delate_Val *\n");
printf("*[9] Find [10] Reverse *\n");
printf("*[11] Sort [12] Clear *\n");
printf("**********[0] Quit System*************\n\n");
printf("请选择\n");
scanf_s("%d", &Select);
if (Select == 0)
{
printf("已经退出\n");
return 0;
}
switch (Select)
{
case 1:
printf("请输入要尾插数据(以-1结束)\n");
while (scanf_s("%d",&x ), x != -1)
{
SListPushBack(&mylist, x);
}
break;
case 2:
printf("请输入要头插数据(以-1结束)\n");
while (scanf_s("%d", &x), x != -1)
{
SListPushFront(&mylist, x);
}
break;
case 3:
SListShow(mylist);
break;
case 4:
x= SListLength(mylist);
printf("链表长度为%d\n",x);
break;
case 5:
SListPopBack(&mylist);
break;
case 6:
SListPopFront(&mylist);
break;
case 7:
printf("你想插入的值\n");
scanf_s("%d", &x);
SListInsertByVal(&mylist, x);
break;
case 8:
printf("你想删除的值\n");
scanf_s("%d", &x);
SListDeleteByVal(&mylist, x);
break;
case 9:
p = SListFind(mylist, x);
printf("%d", p->data);
break;
case 10:
SListReverse(&mylist);
printf("链表的逆置已完成\n");
break;
case 11:
SListSort(&mylist);
printf("排序完毕\n");
break;
case 12:
SListClear(&mylist);
break;
default:
break;
}
}
SListDestroy(&mylist);
}
感谢观看!