1.List.h
各种函数接口的实现
#ifndef __LIST_H__
#define __LIST_H__
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)
#define ElemType int
//无头单链表
typedef struct SListNode
{
ElemType data; //数据域
struct SListNode* next; //指针域
}SListNode;
typedef struct SList
{
SListNode* head; //成员封装
}SList;
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 SListShow(SList* plist);
int SListLength(SList* plist);
SListNode* SListFind(SList* plist, ElemType key);//找到了返回节点的地址 找不到不返回空
void SListClear(SList* plist);
void SListDestroy(SList* plist);
void SListDeleteByVal(SList* plist, ElemType key);//移除第一个key值
void SListInsertByVal(SList* plist, ElemType x);
void SListReverse(SList* plist);
void SListSort(SList* plist);
void SListRemoveAll(SList* plist, ElemType key);//移除所有的key值
SListNode* _Buynode()
{
SListNode* s = (SListNode*)malloc(sizeof(SListNode));
assert(s != NULL);
s->data = 0;
s->next = NULL;
return s;
}
void SListInit(SList* plist)
{
plist->head = NULL;
}
void SListPushBack(SList* plist, ElemType x)
{
assert(plist);
SListNode* s = _Buynode();
s->data = x;
//查找链表的尾部
SListNode* p = plist->head;
//插入的节点是第一个节点
if (p == NULL)
plist->head = s;
else
{
while (p->next != NULL)
p = p->next;
p->next = s;
}
}
void SListPushFront(SList* plist, ElemType x) {
assert(plist);
SListNode* s = _Buynode();
s->data = x;
s->next = plist->head;
plist->head = s;
}
void SListPopBack(SList* plist) {
assert(plist);
SListNode* p = plist->head;
if (p != NULL) {//要删除的链表不能为空
if (p->next == NULL) { //只有一个节点的情况
p = NULL;
free(p);
}
else {
SListNode* pre = NULL;
while (p->next != NULL) {
pre = p;
p = p->next;
}
pre->next = NULL;
free(p);
}
}
}
void SListPopFront(SList* plist) {
assert(plist);
SListNode* p = plist->head;
if (p != NULL) {
plist->head = p->next;
free(p);
}
}
int SListLength(SList* plist) {
assert(plist);
SListNode* p = plist->head;
int count = 1 ;
while (p->next != NULL) {
count++;
p = p->next;
}
return count;
}
SListNode* SListFind(SList* plist, ElemType key) {
assert(plist);
SListNode* p = plist->head;
while (p != NULL && p->data != key) {
p = p->next;
}
return p;
}
void SListDeleteByVal(SList* plist, ElemType key) {
assert(plist);
SListNode* p = plist->head;
SListNode* pre = NULL;
while (p != NULL && p->data != key) {
pre = p;
p = p->next;
}
if (p == NULL) {
return; //遍历完链表,没找到要删的值;
}
if (pre == NULL) {//要删除的是第一个节点;
plist->head = p->next;
}
else {
pre->next = p->next;
}
free(p);
}
void SListInsertByVal(SList* plist, ElemType x) {
assert(plist);
SListNode* s = _Buynode();
s->data = x;
if (plist->head == NULL) {
plist->head = s;
}
else {
SListNode* p = plist->head;
SListNode* pre = NULL;
while (p != NULL && x>p->data) {
pre = p;
p = p->next;
}
if (pre == NULL) {//头部插入
s->next = p;
plist->head = s;
}
else {//链表中间插入;
s->next = pre->next;
pre->next = s;
}
}
}
void SListReverse(SList* plist) {
assert(plist);
if (plist->head == NULL) {
return;
}
if (plist->head->next == NULL) {
return;
}
else {
SListNode* p = plist->head->next;
plist->head->next = NULL;
SListNode* q = p;
while (q != NULL) {
q = q->next;
p->next = plist->head;
plist->head = p;
p = q;
}
}
}
void SListSort(SList* plist)
{
assert(plist);
if (plist->head == NULL) {
return;
}
if (plist->head->next == NULL) {
return;
}
int A[1000] = { 0 };
SListNode* p = plist->head;
SListNode* q = plist->head;
int c = 0;
while (p != NULL) {
A[c] = p->data;
p = p->next;
c++;
} //c即为数组有用的元素个数
for (int i = 0; i < c-1 ; i++) { //冒泡排序
for (int j = 0; j < c -i-1 ; j++) {
if (A[j] > A[j + 1]) {
int tmp = A[j ];
A[j] = A[j+1];
A[j+1] = tmp;
}
}
}
int m = 0;
while (q != NULL) {
q->data = A[m];
q = q->next;
m++;
}
}
void SListRemoveAll(SList* plist, ElemType key) {
assert(plist);
while(NULL != SListFind(plist, key)) {
SListDeleteByVal(plist, key);
}
}
void SListClear(SList* plist) {//释放链表所有节点
assert(plist);
SListNode* p = plist->head;
while (p != NULL) {
plist->head = p->next;
free(p);
p = plist->head;
}
}
void SListDestroy(SList* plist) {//释放所有节点
SListClear(plist);
}
void SListShow(SList* plist)
{
SListNode* p = plist->head;
while (p != NULL)
{
printf("%d-->", p->data);
p = p->next;
}
printf("Over.\n");
}
#endif
2.main.c
#include"List.h"
int main()
{
SList mylist;
SListInit(&mylist);
ElemType item, key;
int pos;
SListNode* p;
int select = 1;
while (select)
{
printf("********************************************\n");
printf("* [0] quit_system [1] push_back *\n");
printf("* [2] push_front [3] show_list *\n");
printf("* [4] pop_back [5] pop_front *\n");
printf("* [6] length [7] insert_val *\n");
printf("* [8] delete_val [9] find *\n");
printf("* [10] sort [11] reverse *\n");
printf("* [12] remove_all [13] clear *\n");
printf("********************************************\n");
printf("请选择:>");
scanf("%d", &select);
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("表长为:>%d\n", SListLength(&mylist));
break;
case 7:
printf("请输入要插入的值:>");
scanf("%d", &item);
SListInsertByVal(&mylist, item);
break;
case 8:
printf("请输入要删除的值:>");
scanf("%d", &key);
SListDeleteByVal(&mylist, key);
break;
case 9:
printf("请输入要查找的值:>");
scanf("%d", &key);
p = SListFind(&mylist, key);
if (p == NULL)
printf("要查找的值%d不存在.\n", key);
else
printf("要查找的值%d存在.\n", key);
break;
case 10:
SListSort(&mylist);
SListShow(&mylist);
break;
case 11:
SListReverse(&mylist);
break;
case 12:
printf("请输入要删除的值:>");
scanf("%d", &key);
SListRemoveAll(&mylist, key);
break;
case 13:
SListClear(&mylist);
break;
default:
break;
}
system("pause");
system("cls");
}
SListDestroy(&mylist);
return 0;
}
3.部分运行结果