线性表练习
#include <stdio.h> #include <malloc.h> int Create(); int Insert(int i, char content); int Delete(char content); int Show(); int Select(int i); int Length(); //定义结构体类型 typedef struct Node { char data; struct Node* next; }node; //创建结构体类型的头指针 node* head; //length为表长 int length; int main() { int choose, i=0, j = 1; char x=0; head = NULL; while (j) { printf("\n\t\t\t\t 线性表子系统"); printf("\n\t\t*************************************************"); printf("\n\t\t* \t 1------建 表 \t\t\t* "); printf("\n\t\t* \t 2------插 入 \t\t\t* "); printf("\n\t\t* \t 3------删 除 \t\t\t* "); printf("\n\t\t* \t 4------显 示 \t\t\t* "); printf("\n\t\t* \t 5------查 找 \t\t\t* "); printf("\n\t\t* \t 6------求 表 长 \t\t* "); printf("\n\t\t* \t 0------返 回 \t\t\t* "); printf("\n\t\t*************************************************"); printf("\n\t\t请选择菜单号码(0-6):"); scanf("%d", &choose); printf("\n"); if (choose == 1) { Create(); printf("\n\t\t\t\t 建表成功!!!\n"); } else if (choose == 5) { Select(i); } else if (choose == 2) { Insert(i, x); } else if (choose == 3) { Delete(x); } else if (choose == 4) { if (head == NULL) { printf("\n\t\t抱歉!线性表为空,请先建表!"); } else { Show(); } } else if (choose == 6) { Length(); } else if (choose == 0) { j = 0; } else { printf("输入错误,请重新输入!"); } } } //新建表 int Create() { //content为用户输入的内容 char content; //key判断是否继续循环 int key = 1; //为头结点分配空间 head = (node*)malloc(sizeof(node)); //*l 为尾指针 *n为新指针 node* l, * n; //表长初始值为0 length = 0; //尾指针指向头结点 l = head; printf("\n\t\t请逐个输入结点。以g位结束标记!\n"); //根据key的值判断是否继续循环 while (key) { printf("\n\t\t请输入一个字符数据,并按回车:\n"); //接收用户输入的内容 scanf_s("\n%c", &content, 12); //判断用户输入的字符是否为结束字符 if (content != 'g') { //创建新结点 n = (node*)malloc(sizeof(node)); //表长加1 length++; //将用户输入的内容赋给新结点 n->data = content; //将新结点添加到尾指针的下一个结点位置 l->next = n; //将新结点的下一个结点赋为空值 n->next = NULL; //尾指针指向新结点 l = n; } //用户输入结束字符,改变key值结束循环 else { key = 0; } } return 0; } //添加 int Insert(int i, char content) { node* p, * n; int num = 1;//num计数,方便指针定位到要插入的位置的前一位 p = head; printf("\t\t请输入要插的位置和数值<i x>,并按回车:\n"); scanf_s("\n%d %c", &i, &content, 20); if (i > 0) { //定位指针p到要添加的位置的前一位,即num=i-1 while (p != NULL && num < i) { num++; p = p->next; } if (p != NULL) { n = (node*)malloc(sizeof(node)); n->data = content; n->next = p->next;//把p结点的下一个结点放到新结点的后面 p->next = n;//把新结点放到结点p后 length++; printf("\n\t\t插入成功"); } else { printf("\n\t\t线性表为空或插入的位置超界"); } } else { printf("\n\t\t线性表为空或插入的位置有误"); } return 0; } //删除(按内容删除) int Delete(char content) { node* h, * l;//定义两个指针*h指向头结点,*l指向头结点后面的结点,方便删除之后把后面的结点往前移动 h = head;//*h指向头结点 l = head->next; printf("\n\t\t请输入要删除的数据元素:"); scanf("\t\t%c", &content); //定位p指正到需要删除的结点 while (l != NULL && l->data != content) { h = l;//指针h往后移动 l = l->next;//指针l往后移动,h和l指针始终保持相邻, //l指针找到删除的结点删除之后,把l指针指向的结点的后一结点移动到h指针指向的结点的后面 } if (l != NULL) { //把删除结点后的结点移动到h指针指向的结点后面 h->next = l->next; free(l);//释放l指针 length--; printf("\n\t\t删除成功,结点%c已经被删除!", content); } else { printf("\n\t\t抱歉!没有找到您要删除的结点\n"); } return 0; } //显示 int Show() { node* p; p = head; printf("\n\t\t显示线性表的所有元素:\n\t\t"); while (p->next != NULL) { printf("%5c", p->next->data); p = p->next; //后移指针 } if (head->next == NULL || p == NULL) { printf("\n\t\t链表为空"); } return 0; } //查找 int Select(int i) { node* p;//用指针 p 指向当前扫描到的结点。 int j = 0; //用 j 作统计已扫描结点数的计数器,j 的初值为 1 。 p = head;//p 的初值指链表中的第一个元素. printf("\n\t\t请输入要查找的结点的位置,并按回车:\n"); scanf_s("\n%d", &i, 10); //指针扫描到j==i即当前位置退出循环,定位指针p到查找的节点位置 while (p->next != NULL && j < i) { p = p->next; j++; } if (j == i) //当 j=i时,指针 p 所指的结点就是第 i 个结点 { printf("\n\t\t查找的此结点所在位置的值为:%c", p->data); } else { printf("\n\t\t未找到此节点,请确认输入是否正确!!"); } return 0; } //查询表长 int Length() { node* p; length = 0; p = head; while (p->next != NULL && p != NULL) { length++; //表的长度加1 p = p->next; //后移指针 } if (p->next == NULL) //如果到表尾 { printf("\n\t\t线性表的长度为:%d", length); } else { printf("\n\t\t链表不存在"); } return 0; }
本文来自博客园,作者:{繁星划过天际},转载请注明原文链接:https://www.cnblogs.com/Aliezerofist/p/15417894.html