C:C语言实现的链表及其各种链表操作
2018-03-15 16:04
507 查看
#include<stdio.h> #include<stdlib.h> typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; //LNode : 结构体类型,LinkList :结构体指针; typedef enum { false = 0, true = 1, }bool; //LNode* 等价于 LinkList //头插法 LinkList CreatList1(LinkList L) { LinkList s; int x; L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; scanf_s("%d", &x); //输入X的值 while (x != 99) { s = (LinkList)malloc(sizeof(LNode)); s->data = x; //给第一个节点赋值 s->next = L->next; //设置节点后为NULL L->next = s; //头插 scanf_s("%d", &x); } return L; } //尾插法 LinkList CreatList2(LinkList L) { LinkList s; L = (LinkList)malloc(sizeof(LNode)); LinkList r = L; int x; scanf_s("%d", &x); while (x != 99) { s = (LinkList)malloc(sizeof(LNode)); s->data = x; r->next = s; //首次放在头节点之后,之后放在最后一个节点后 r = s; //r等于最后一个节点 scanf_s("%d", &x); } r->next = NULL; //下一个节点为NULL return L; } //输出链表 void PrintList(LinkList L) { LinkList r; r = L->next; while (r != NULL) { printf("%d\n", r->data); r = r->next; } } //输出链表长度(不包括头结点) int Length(LinkList L) { int length = 0; LinkList r; r = L->next; while (r != NULL) { length++; r = r->next; } return length; } //判断是否为空 bool Empty(LinkList L) { if (L->next == NULL) { printf("List Is Empty\n"); return false; } else { printf("List Is Not Empty\n"); return true; } } //删除整个链表 void DestroyList(LinkList L) { LinkList s = L->next; LinkList head = L->next; printf("List Has Been Destroyed!\n"); while (head != NULL) { head = head->next; free(s); s = head; } L->next = NULL; } int ListDelete(LinkList L, int i) { if (i<1 || i>Length(L)) { printf("Index Is Longer Then List Length!\n"); return -1; } int index = 0; LinkList r = L, s; while (index != i - 1) { r = r->next; index++; }//r处于第i-1个节点,index=i-1 s = r->next; index = s->data; r->next = r->next->next; free(s); return index; } //插入元素 bool ListInsert(LinkList L, int i, int e) { int index = 0; LinkList r = L; LinkList s; int length = Length(L); if (i<1 || i>length + 1) { printf("Index Is Longer Then List Length!\n"); return false; } while (index != i - 1) { r = r->next; index++; }//r处于第i-1个节点,index=i-1 s = (LNode*)malloc(sizeof(LNode)); s->data = e; //正常情况 if (i<length + 1) { s->next = r->next; r->next = s; } //如果插入位置为最后一位 else { r->next = s; s->next = NULL; } return true; } //得到指定位置的值 LinkList GetElem(LinkList L, int i) { if (i<1 || i>Length(L)) { printf("Index Is Longer Then List Length!\n"); return L; } int index = 0; LinkList r = L; while (index != i) { r = r->next; index++; }//r处于第i个节点,index=i // return r->data; return r; } void main() { int index, i, e; LinkList r, L = NULL; while (1) { printf("+-----------------------------------+\n"); printf("| Choose The Number: |\n"); printf("| 1.Creat List |\n"); printf("| 2.Print All Elem Of List |\n"); printf("| 3.Print List Length |\n"); printf("| 4.Is List Empty? |\n"); printf("| 5.Insert Elem In List's Index |\n"); printf("| 6.Delete Index In List |\n"); printf("| 7.Get Index In List |\n"); printf("| 8.Destroy List |\n"); printf("| 9.Exit |\n"); printf("+-----------------------------------+\n"); printf("Input Your Choice : \n"); scanf_s("%d", &index); printf("============================================\n"); switch (index) { //Creat List case 1: if(L == NULL||L->next==NULL){ printf("Input '99' To Finish Input!\n"); L = CreatList2(L); printf("============================================\n"); } else{ printf("Please Confirm List Is Empty!\n"); printf("============================================\n"); } break; /* 可选的 */ //Print All Elem List case 2: if (Length(L)>0) { PrintList(L); printf("============================================\n"); } else { printf("List is Empty\n"); printf("============================================\n"); } break; /* 可选的 */ //Print List Length case 3: printf("List Length : %d\n", Length(L)); printf("============================================\n"); break; /* 可选的 */ //Is List Empty? case 4: Empty(L); printf("============================================\n"); break; /* 可选的 */ //Insert Elem In List's Index case 5: printf("Input Insert Index : \n"); scanf_s("%d", &i); printf("Input Insert Elem : \n"); scanf_s("%d", &e); ListInsert(L, i, e); printf("============================================\n"); break; /* 可选的 */ //Delete Index In List case 6: printf("Input Delete Index : \n"); scanf_s("%d", &i); ListDelete(L, i); printf("============================================\n"); break; /* 可选的 */ //Get Index In List case 7: printf("Input Index : \n"); scanf_s("%d", &i); r = GetElem(L, i); if (r!=L){ printf("This Elem is %d\n", r->data); printf("============================================\n"); } break; /* 可选的 */ case 8: DestroyList(L); break; /* 可选的 */ /* 您可以有任意数量的 case 语句 */ default: /* 可选的 */ exit(0); break; //statement(s); } } }
相关文章推荐
- c语言实现单链表数据结构及其基本操作
- C语言实现单链表的基本操作及其部分面试题
- 对链表各种操作的实现(C语言)
- 单链表及其基本操作(C语言实现)
- 链表及其各种函数操作的实现方法
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
- 单循环链表各种操作的C语言实现
- C语言实现单链表的基本操作及其部分面试题
- c语言实现链表及其基本操作
- C语言实现链表及其操作
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
- C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)
- 用C语言实现单链表的各种操作(一)
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- c语言实现单链表操作
- java实现链表及其相关操作
- 写的很好 链表的各种题目整理(C语言实现)
- 单链表相关操作之C语言实现:插入,删除,倒转,复制,查找。。。
- 【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)
- 算法与数据结构-单向链表的基本操作C语言实现