list.h
#ifndef _LIST_H_
#define _LIST_H_
#include
#include
#include
#include
#define ElemType int
void Swap(ElemType *a, ElemType *b)
{
ElemType tmp = *a;
*a = *b;
*b = tmp;
}
#endif /* _LIST_H_ */
slist.h
建立一个单链表结构体,包含数据域和next指针域
创建一个含有头指针的结构体
单链表的函数接口声明
单链表的函数接口实现
#ifndef _SLIST_H_
#define _SLIST_H_
#include"list.h"
//无头单链表
typedef struct SListNode
{
ElemType data;
struct SListNode *next;
}SListNode;
typedef struct SList
{
SListNode *head;
}SList;
///
//单链表的函数接口声明
static SListNode* _Buynode(ElemType x);
void SListInit(SList *plist);
void SListPushBack(SList *plist, ElemType x);
void SListPushFront(SList *plist, ElemType x);
void SListPopBack(SList *plist);
void SListPopFront(SList *plist);
void SListDestroy(SList *plist);
void SListInsertByVal(SList *plist, ElemType x);
SListNode* SListFind(SList *plist, ElemType key);
void SListDeleteByVal(SList *plist, ElemType key);
void SListClear(SList *plist);
size_t SListLength(SList *plist);
void SListReverse(SList *plist);
void SListSort(SList *plist);
void SListShow(SList *plist);
//
//单链表的函数接口实现
static SListNode* _Buynode(ElemType x)
{
SListNode *s = (SListNode*)malloc(sizeof(SListNode));
assert(s != NULL);
s->data = x;
s->next = NULL;
return s;
}
void SListInit(SList *plist)
{
plist->head = NULL;
}
void SListPushBack(SList *plist, ElemType x)
{
assert(plist != NULL);
SListNode *s = _Buynode(x);
//插入的节点为第一个节点
if (plist->head == NULL)
{
plist->head = s;
return;
}
//O(n)
SListNode *p = plist->head;
//查找链表的尾部节点
while (p->next != NULL)
p = p->next;
p->next = s;
}
void SListPushFront(SList *plist, ElemType x)
{
assert(plist != NULL);
SListNode *s = _Buynode(x);
//O(1)
s->next = plist->head;
plist->head = s;
}
void SListPopBack(SList *plist)
{
assert(plist != NULL);
SListNode *p, *prev;
if (plist->head == NULL)
return;
p = plist->head;
//链表只有一个节点
if (p->next == NULL)
plist->head = NULL;
else
{
while (p->next != NULL)
{
prev = p;
p = p->next;
}
}
free(p);
}
void SListPopFront(SList *plist)
{
assert(plist != NULL);
SListNode *p = plist->head;
if (plist->head == NULL)
return;
plist->head = p->next;
free(p);
}
SListNode* SListFind(SList *plist, ElemType key)
{
assert(plist != NULL);
SListNode *p = plist->head;
//空链表 NULL
//存在 P
//不存在 NULL
while (p != NULL && p->data != key)
p = p->next;
return p;
}
void SListDeleteByVal(SList *plist, ElemType key)
{
assert(plist != NULL);
SListNode *prev = NULL;
SListNode *p = SListFind(plist, key);
if (p == NULL)
{
printf("要删除的节点不存在.\n");
return;
}
if (p == plist->head)
plist->head = p->next;
else
{
prev = plist->head;
while (prev->next != p)
prev = prev->next;
//删除节点
prev->next = p->next;
}
free(p);
}
size_t SListLength(SList *plist)
{
assert(plist != NULL);
size_t len = 0;
SListNode *p = plist->head;
while (p != NULL)
{
len++;
p = p->next;
}
return len;
}
void SListShow(SList *plist)
{
assert(plist != NULL);
SListNode * p = plist->head;
while (p != NULL)
{
printf("%d-->", p->data);
p = p->next;
}
printf("Over.\n");
}
void SListDestroy(SList *plist)
{
SListClear(plist);
plist->head = NULL;
}
void SListClear(SList *plist)
{
assert(plist != NULL);
SListNode *p = plist->head;
while (p != NULL)
{
plist->head = p->next;
free(p);
p = plist->head;
}
}
void SListReverse(SList *plist)
{
assert(plist != NULL);
SListNode *p = plist->head->next;
SListNode *q;
if (p->next == NULL)
return;
//断开第一个节点
plist->head->next = NULL;
while (p != NULL)
{
q = p->next;
p->next = plist->head;
plist->head = p;
p = q;
}
}
void SListInsertByVal(SList *plist, ElemType x)
{
assert(plist != NULL);
SListNode *prev = NULL;
SListNode *p = plist->head;
SListNode *s = _Buynode(x);
while (p != NULL && x > p->data)
{
prev = p;
p = p->next;
}
if (prev == NULL) //需要进行头插
{
s->next = p;
plist->head = s;
}
else
{
s->next = prev->next;
prev->next = s;
}
}
void SListSort(SList *plist)
{
assert(plist != NULL);
SListNode *p = plist->head->next;
SListNode *q, *t, *prev = NULL;
plist->head->next = NULL; //断开链表
t = plist->head;
while (p != NULL)
{
q = p->next;
//把p节点摘除进行按值插入,升序
while (t != NULL && p->data > t->data)
{
prev = t;
t = t->next;
}
if (prev == NULL)
{
p->next = plist->head;
plist->head = p;
}
else
{
p->next = prev->next;
prev->next = p;
}
p = q;
t = plist->head;
}
}
#endif /* _SLIST_H_ */
main.c
主函数功能调用
#define _CRT_SECURE_NO_WARNINGS 1
#include"slist.h"
int main()
{
SList mylist;
SListInit(&mylist);
SListNode *p;
ElemType item, key;
int select = 1;
int pos = 0;
while (select)
{
printf("***********************************************\n");
printf("* [1] push_back [2] push_front *\n");
printf("* [3] show_list [0] quit_system *\n");
printf("* [4] pop_back [5] pop_front *\n");
printf("* [*6] insert_pos [7] insert_val *\n");
printf("* [*8] delete_pos [9] delete_val *\n");
printf("* [10] find_val [11] length *\n");
printf("* [*12] capacity [13] sort *\n");
printf("* [14] reverse [15] clear *\n");
printf("* [16] remove_all *\n");
printf("***********************************************\n");
printf("请选择:>");
scanf("%d", &select);
if (select == 0)
break;
switch (select)
{
case 1:
printf("请输入要插入的值[以-1结束]:>");
while (scanf("%d", &item), item != -1)
{
SListPushBack(&mylist, item);
}
break;
case 2:
printf("请输入要插入的值[以-1结束]:>");
while (scanf("%d", &item), item != -1)
{
SListPushFront(&mylist, item);
}
break;
case 3:
SListShow(&mylist);
break;
case 4:
SListPopBack(&mylist);
break;
case 5:
SListPopFront(&mylist);
break;
case 6:
printf("请输入要插入的位置:>");
scanf("%d", &pos);
printf("请输入要插入的数据:>");
scanf("%d", &item);
//SeqListInsertByPos(&mylist, pos, item);
break;
case 7:
//SeqListSort(&mylist);
printf("请输入要插入的数据:>");
scanf("%d", &item);
SListInsertByVal(&mylist, item);
break;
case 8:
printf("请输入要删除的位置:>");
scanf("%d", &pos);
//SeqListDeleteByPos(&mylist, pos);
break;
case 9:
printf("请输入要删除的值:>");
scanf("%d", &key);
SListDeleteByVal(&mylist, key);
break;
case 10:
printf("请输入要查找的值:>");
scanf("%d", &key);
p = SListFind(&mylist, key);
if (p == NULL)
printf("要查找的值不存在.\n");
else
printf("要查找的值为:> %d\n", p->data);
break;
case 11:
printf("seqlist len = %d\n", SListLength(&mylist));
break;
case 12:
//printf("seqlist capacity = %d\n", SeqListCapacity(&mylist));
break;
case 13:
SListSort(&mylist);
printf("单链表排序成功......\n");
break;
case 14:
SListReverse(&mylist);
break;
case 15:
SListClear(&mylist);
printf("清除数据表成功......\n");
break;
case 16:
printf("请输入要删除的值:>");
scanf("%d", &key);
//SeqListRemoveAll(&mylist, key);
break;
}
}
SListDestroy(&mylist);
printf("GoodBye......\n");
return 0;
}