单向链表
2017-05-11 00:15
232 查看
这是一个C语言写的单向链表,数据比较简单
// sngly-linked list.cpp : 定义控制台应用程序的入口点。 //第一个链表存放链表信息 ////空表:除了头结点,其他表为空 #include "stdafx.h" #include<stdlib.h> #define initSize 10 #define increment 2 typedef int ElemType; typedef int status; typedef struct SL { ElemType data; int position; SL *next; }; SL *s, *m;//用于创建链表 SL *head,*tail;//头指针,尾指针 int size = 0; SL* initList(SL *a, SL *b, int length); void traverse(SL *s); void insert(SL*a); void Pdeletion(SL *a); void reorder(SL *a); void Ddeletion(SL *a); void PFrontChect(SL *a); void PNextChect(SL *a); void overview(); void destory(SL *a); void clearData(SL *a); void DFrontChect(SL *a); void DNextChect(SL *a); void IsEmpty(SL *a); int main() { int length;//链表长度 printf("请输入您需要的链表长度:"); scanf("%d", &length); traverse(initList(s, m, length)); traverse(head); insert(tail); traverse(head); insert(tail); traverse(head); Pdeletion(head); Pdeletion(head); reorder(head); traverse(head); Ddeletion(head); Ddeletion(head); Ddeletion(head); traverse(head); PFrontChect(head); traverse(head); PNextChect(head); traverse(head); overview(); traverse(head); clearData(head); traverse(head); destory(head); traverse(head); DFrontChect(head); DFrontChect(head); DNextChect(head); DNextChect(head); IsEmpty(head); clearData(head); IsEmpty(head); destory(head); IsEmpty(head); Ddeletion(head); traverse(head); return 0; } SL* initList(SL *a,SL *b,int length) { size = initSize + sizeof(SL); a = b = ( SL *) malloc(initSize + sizeof(SL)); head = a; for (int i = 0; i < length; i++) { if (i == 0) { a->data = length; b = (SL *)malloc(initSize + sizeof(SL)); a->next = NULL; a->position = i; continue; } else { a->next = b; a = b; } printf("请为NO.%d赋值:", i); scanf("%d", &a->data); printf("已经为NO.%d赋值:%d\n", i, a->data); b = (SL *)malloc(initSize + sizeof(SL)); a->next = NULL; a->position = i; } tail = a; printf("链表长度为%d,空间大小为%d\n", length, size); free(b); return head; } void traverse(SL *a) { if (a == NULL) { printf("链表不存在\n"); return; } printf("本链表共%d个,这是第0个\n", a->data); a = a->next; while (a != NULL) { printf("第%d个:%d\t",a->position, a->data); a = a->next; }printf("\n"); } //在最后一个插入,传入尾指针 void insert(SL*a) { if (a == NULL) { printf("链表不存在\n"); return; } head->data++; s = (SL*)malloc(initSize + sizeof(SL)); s->position=a->position++; a->next = s; s->next = NULL; printf("请输入插入的数据:"); scanf("%d", &s->data); tail = s;//尾指针变动 } //删除某一个,依据position,传入头指针 void Pdeletion(SL *a) { int times = 0; if (a == NULL) { printf("链表不存在\n"); return; } int p; printf("请输入要删除的链表序号\n"); scanf("%d", &p); if (p == 0) { printf("链表第0个元素不可删除,除非使用destory\n"); return; } while (a != NULL) { if (a->position == p) { //如果是最后一个元素,变动尾指针 if (p == tail->position) { tail = s; } s->next = a->next; a->next = NULL; free(a); head->data--; return; } else { s = a; a = a->next; } } printf("未查询到该数据\n"); return; } //删除某一个,依据data,传入头指针, 可以批量删除 void Ddeletion(SL *a) { int times=0; if (a == NULL) { printf("链表不存在\n"); return; } ElemType d; printf("请输入要删除的链表数据\n"); scanf("%d", &d); s = a; while (a != NULL) { if (a->data == d) { //如果是最后一个元素,变动尾指针 if (d == tail->data||a->next==NULL) { tail = s; } //如果第0个,跳过 if (a->position == 0) { printf("链表第0个不可删除,除非使用destory\n"); s = a; a = a->next; continue; } s->next = a->next; a->next = NULL; free(a); a = s->next; head->data--; times++; } else { s = a; a = a->next; } } if (times==0) { printf("未查询到该数据\n"); return; } else { printf("已经删除%d个\n", times); return; } } //重新排序,依照链表位置依次赋值position 1~n,传入头指针 void reorder(SL *a) { if (a == NULL) { printf("链表不存在\n"); return; } a = a->next; for (int i=1;a != NULL;i++) { a->position = i; a = a->next; } } //前驱查询,传入头指针,依据位置position void PFrontChect(SL *a) { if (a == NULL) { printf("链表不存在\n"); return; } int p; printf("请输入要进行前驱查询的的链表序号\n"); scanf("%d", &p); if (p == 0) { printf("这是第一个链表元素,不存在前驱\n"); return; } else { while (a != NULL) { if (a->position == p) { printf("第%d个:%d的前驱是:\t", a->position, a->data); printf("第%d个:%d\n", s->position, s->data); return; } else { s = a; a = a->next; } } printf("不存在该链表\n"); return; } } //后继查询,传入头指针,依据位置position void PNextChect(SL *a) { if (a == NULL) { printf("链表不存在\n"); return; } int p; printf("请输入要进行后继查询的的链表序号\n"); scanf("%d", &p); if (p == tail->data-1) { printf("这是最后一个链表元素,不存在后继\n"); return; } else { while (a != NULL) { if (a->position == p) { printf("第%d个:%d的后继是:\t", a->position, a->data); a = a->next; if (a == NULL) { printf("这是最后一个链表元素,不存在后继\n"); } else { printf("第%d个:%d\n", a->position, a->data); } return; } else { a = a->next; } } printf("不存在该链表\n"); return; } } void DFrontChect(SL *a) { { if (a == NULL) { printf("链表不存在\n"); return; } int d; printf("请输入要进行前驱查询的的链表数据\n"); scanf("%d", &d); if (d == a->data) { printf("这是第一个链表,不存在前驱\n"); return; } else { while (a != NULL) { if (a->data == d) { printf("第%d个:%d的前驱是:\t", a->position, a->data); printf("第%d个:%d\n", s->position, s->data); return; } else { s = a; a = a->next; } } printf("不存在该链表\n"); return; } } } void DNextChect(SL *a) { if (a == NULL) { printf("链表不存在\n"); return; } int d; printf("请输入要进行后继查询的的链表数据\n"); scanf("%d", &d); if (d == tail->data) { printf("这是最后一个链表,不存在后继\n"); return; } else { while (a != NULL) { if (a->data == d) { printf("第%d个:%d的后继是:\t", a->position, a->data); a = a->next; printf("第%d个:%d\n", a->position, a->data); return; } else { a = a->next; } } printf("不存在该链表\n"); return; } } //查看表信息 void overview() { if (head == NULL) { printf("链表不存在\n"); return; } printf("本链表共%d个元素,空间大小为%d\n", head->data,sizeof(SL)+initSize); return; } //销毁,传入头指针 void destory(SL *a) { if (a == NULL) { printf("链表不存在\n"); return; } s = a; while (a != NULL) { a = a->next; free(s); s = a; } head = NULL; return ; } //清空,,传入头指针 void clearData(SL *a) { if (a == NULL) { printf("链表不存在\n"); return; } a = a->next; for (int i = 1; a != NULL; i++) { a->data = '\0'; a = a->next; } } void IsEmpty(SL *a) { if (a == NULL) { printf("表不存在\n"); return; } if (a->data == 1) { printf("空表\n");//除了头结点,其他表为空 return; } else { printf("表非空\n"); return; } }