头文件SList.h
#define ElemType int #include<stdio.h> #include<malloc.h> #include<assert.h> typedef struct Node {//结点类型 ElemType data; struct Node *next; }Node,*PNode; typedef struct List {//mylist单链表的结构 PNode first; PNode last; size_t size; }List; void InitList(List *list);//初始化 void push_back(List *list, ElemType elem);//尾插 void push_front(List *list, ElemType elem);//头插 void Show_list(List *list);//显示 void pop_back(List *list);//尾删 void pop_front(List *list);//头删 void insert_val(List *list, ElemType elem);//按值插入 Node* find_val(List *list, ElemType elem);//按值查找 int length(List *list);//求链表长度 void delete_val(List *list, ElemType elem);//按值删除 void sort(List *list);//排序 void reserve(List *list);//逆序 void clear(List *list);//清除链表 void destroy(List *list);//销毁链表
源文件SList.c(函数实现)
#include"SList.h" void InitList(List *list) { list->first = list->last = (Node*)malloc(sizeof(Node)); assert(list->first != NULL); list->first->next = NULL; list->size = 0; } void push_back( List *list,ElemType elem) { Node* s= (Node*)malloc(sizeof(Node)); assert(s != NULL); s->data = elem; s->next = NULL; list->last->next = s; list->last = s; list->size++; } void push_front(List *list, ElemType elem) { Node* s = (Node*)malloc(sizeof(Node)); assert(s != NULL); s->data = elem; s -> next = list->first->next; list->first->next= s; if (list->size == 0) {//只有一个结点,则插入结点为第一个数据结点 list->last = s; } list->size++; } void Show_list(List *list) { Node *p = list->first->next; while (p != NULL) { printf("%d-->", p->data); p = p->next; } printf("Nul.\n"); } void pop_back(List *list) { if (list->size == 0) return; Node *p = list->first; while (p->next!= list->last) { p = p->next; } free(list->last); list->last = p; list->last->next = NULL; list->size--; } void pop_front(List *list) { if (list->size == 0) return; Node *p = list->first->next;//指向第一个数据结点 list->first->next = p->next; free(p); if (list->size == 1)//存在一个头节点一个数据结点 { list->last = list->first; } list->size--; } void insert_val(List *list, ElemType elem) {//必须单链表有序 Node* s = (Node*)malloc(sizeof(Node)); assert(s != NULL); s->data = elem; s->next = NULL; Node *p = list->first; while (p != NULL && p->next->data < elem) { p = p->next; //if (p->next== NULL) { //list->last = s; //} } s->next = p->next; p->next = s; list->size++; } Node* find_val(List *list, ElemType elem) { Node *p = list ->first->next; while (p != NULL && p->data != elem) { p = p->next; } return p; } int length(List *list) { return list->size; } void delete_val(List *list, ElemType elem) { if (list -> size == 0) return; Node *p = find_val(list, elem); if (p == NULL) { printf("要删除的值不存在\n"); return; } if (p == list->last) { pop_back(list); } else { Node*q = p->next; p->data = q->data; p->next = q->next; free(q); list->size--; } } void sort(List *list) { if (list->size == 0 || list->size == 1) return; Node *s = list->first->next; Node *q = s->next; list->last = s; list->last->next = NULL; while (q != NULL) { s = q; q = q->next; Node *p = list->first; while (p->next != NULL && p->next->data < s->data) { p = p->next; if (p->next == NULL) { list->last = s; } } s->next = p->next; p->next = s; } } void reserve(List *list) { if (list->size == 0 || list->size == 1) return; else { Node *p = list->first->next; Node *q = p->next; list->last = p; list->last->next = NULL; while (q != NULL) { p = q; q = p->next; p->next = list->first->next; list->first->next = p; } } } void clear(List *list) { if (list->size == 0) return; Node *p = list->first->next; while (p != NULL) { list->first->next = p->next; free(p); p = list->first->next; } list->last = list->first; list->size = 0; } void destroy(List *list) { clear(list);//clear结束后只剩下头结点 free(list->first); list->first = list->last = NULL; }
测试文件(Main.c)
#include"SList.h" #include<stdio.h> int main() { List mylist; Node *p = NULL; InitList(&mylist); ElemType select = 1, elem = 0; while (select) { printf("*******************************\n"); printf("*[1] push_back***[2] push_front\n"); printf("*[3] show_list***[4] pop_back\n"); printf("*[5] pop_front***[6] insert_val\n"); printf("*[7] find_val ***[8] length\n"); printf("*[9] delete_val**[10] sort\n"); printf("*[11] resever****[12] clear\n"); printf("*[13*] destroy****[0] quit_syste\n"); printf("*******************************\n"); printf("请选择您要的操作:\n"); scanf_s("%d", &select); if (select == 0) break; switch (select) { case 1: printf("请输入要插入的数据(-1表示结束)\n"); while (scanf_s("%d", &elem) ,elem!= -1) { push_back(&mylist, elem); } break; case 2: printf("请输入要插入的数据(-1表示结束)\n"); while (scanf_s("%d", &elem), elem != -1) { push_front(&mylist, elem); } break; case 3: Show_list(&mylist); break; case 4: pop_back(&mylist); break; case 5: pop_front(&mylist); break; case 6: printf("请输入要插入的数据:\n"); scanf_s("%d", &elem); insert_val(&mylist,elem); break; case 7: printf("请输入要查找的数据:\n"); scanf_s("%d", &elem); p=find_val(&mylist, elem);//返回该节点的地址 if (p == NULL) printf("要查找的数据在链表中不存在\n"); break; case 8: printf("单链表的长度为%d:\n", length(&mylist)); break; case 9: printf("请输入要删除的值\n"); scanf_s("%d", &elem); delete_val(&mylist, elem); break; case 10: sort(&mylist); break; case 11: reserve(&mylist); break; case 12: clear(&mylist); break; default: printf("输入的命令错误,请重新输入!\n"); break; } } destroy(&mylist); }