数据结构-单链表的基本操作
数据结构,单链表的基本操作
#define _CRT_SECURE_NO_DEPRECATE #include<stdbool.h> #include<stdio.h> #include<stdlib.h> #define ture 1 /* 尾插法有点小问题,遍历输出的时候会在输出完中断程序,但是显示的尾插法没问题 */ typedef struct LNode { int data; struct LNode * next; }LNode,*LinkList; //头插法建立单链表 LinkList List_HeadInsert(LinkList &L) { int x; LNode *s; L = (LinkList)malloc(sizeof(LinkList));//为L申请空间 L->next = NULL;//防止脏数据 printf("请输入要插入的数,输入999结束\n"); scanf("%d", &x); while (x!=999) { s = (LNode*)malloc(sizeof(LNode));//为S申请空间 s->data = x;//s的数据域为x s->next = L->next; L->next = s; printf("请输入要插入的数,输入999结束\n"); scanf("%d", &x); } return L; } //尾插法建立单链表 LinkList List_TailInsert(LinkList &L) { int x; LNode *s,*r; L = (LinkList)malloc(sizeof(LinkList));//为L申请空间 s = r = L; printf("请输入要插入的数,输入999结束\n"); scanf("%d", &x); while (x != 999) { s = (LNode*)malloc(sizeof(LNode));//为S申请空间 s->data = x;//s的数据域为x r->next = s; r = s; printf("请输入要插入的数,输入999结束\n"); scanf("%d", &x); } return L; } //按位查找 LNode *GetElem(LinkList L, int i) { if (L == NULL) return false; int j=0; LNode *p; p = L; while (p != NULL && j<i) { p = p->next; j++; } return p; } //创建一个空的单链表 bool InitList(LinkList &L){ L = (LNode*)malloc(sizeof(LNode)); if (L == NULL) return false; L->next = NULL; return ture; } //按位插入 bool listInsert(LinkList &L,int i,int e) { if(i<1)//判断输入是否合法 return false; LNode *p; int j = 0; p=GetElem(L, i - 1);//按位查找 if (p == NULL) return false; LNode *s = (LNode *)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; return ture; } //遍历单链表 void showList(LinkList L) { //pH->data // 头节点数据,不是链表的常规数据,不要算进去了 LNode *p = L; // 头指针后面是头节点 printf("-----------开始遍历-----------\n"); while (NULL != p->next) // 是不是最后一个节点 { p = p->next; // 走到下一个节点,也就是循环增量 printf("node data: %d.\n", p->data); } printf("-------------完了-------------\n"); /*LNode *p; p = L; printf("--------------开始遍历-----------\n"); while (p->next!=NULL) { p = p->next; printf("%d\t", p->data); } printf("\n"); printf("-------------遍历结束-------------\n");*/ } int main() { LinkList L; LNode *p; int g = 0; int n = -1; InitList(L); listInsert(L, 1, 1); listInsert(L, 2, 2); listInsert(L, 3, 3); while (g != -1) { printf("请选择功能:\n"); printf("1、头插法创建链表\n"); printf("2、尾插法创建链表\n"); printf("3、按位查找\n"); printf("4、删除\n"); printf("输入 -1 退出操作\n"); printf("请输入:"); scanf("%d", &g); printf("\n"); if (g == 1) { List_HeadInsert(L); printf("使用头插法创建的单链表为:\n"); showList(L); } else if (g==2) { List_TailInsert(L); printf("使用尾插法创建的单链表为:\n"); showList(L); } else if (g == 3) { printf("请输入需要查找第几位:"); scanf("%d", &n); p=GetElem(L, n); if (p == NULL) printf("查找的数据有误,请重新输入"); printf("第%d的数为:\t%d\n",n,p->data); } } }