单链表的操作(C语言描述)
来源:互联网 发布:java true false类型 编辑:程序博客网 时间:2024/05/21 09:38
单链表的操作(*C语言描述*)
线性表的链式存储结构是用一组任意的存储单元保存线性表的数据元素。
为了操作方便,我们在创建链表时,常采用有头结点的链表。
头结点:
- ### 头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等)。
- ### 有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。
- ### 首元结点也就是第一个元素的结点,它是头结点后边的第一个结点。
- ### 头结点不是链表所必需的。
以学生信息管理为例
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct Student_Information{ int num; char name[5]; double marks;}Stu_In;typedef struct Student { Stu_In s; int size; struct Student *next;}Stu;Stu_In input()//输入结点信息{ Stu_In s; printf("input information\n"); scanf("%d %s %lf", &s.num, s.name, &s.marks); return s;}Stu *Create_End() //有头结点尾插法创建链表{ int b; Stu *head, *temp, *p; head = (Stu*)malloc(sizeof(Stu)); head->size = 0; p = head; //让p指向头节点 while(1) { b = 1; printf("1 or 0\n"); scanf("%d", &b); if(b == 0) break; temp = (Stu*)malloc(sizeof(Stu)); temp->s = input(); p->next = temp; //把新节点添加到表尾 p = temp; // (p = p->next;)把指针指向新节点 head->size++; } p->next = NULL; //尾节点的指针域置空 return head;}Stu *Create_Front() //头插法创建链表{ int b; Stu *head, *p; head = (Stu*)malloc(sizeof(Stu)); head->size = 0; while(1) { b = 1; printf("1 or 0\n"); scanf("%d", &b); if(b == 0) break; p = (Stu*)malloc(sizeof(Stu)); p->s = input(); p->next = head->next; head->next = p; head->size++; } return head;}Stu* Insert(Stu* L)//将新节点插入指定结点后{ int Lc; printf("please input number\n"); scanf("%d", &Lc); Stu *p, *temp; p = L; temp = (Stu*)malloc(sizeof(Stu)); printf("please input insert data\n"); temp->s = input(); while(Lc > 0){ p = p->next; Lc--; } temp->next = p->next; p->next = temp; L->size++; return L;}Stu* Delete(Stu* L)//删除指定结点{ int Lc; Stu *p, *p1; printf("please input number\n"); scanf("%d", &Lc); p = L; while(Lc > 0){ p1 = p; p = p->next; Lc--; } p1->next = p->next; L->size--; free(p); return L;}Stu* Sort(Stu *L)//按成绩倒序{ Stu *p, *p1, *temp; temp = (Stu*)malloc(sizeof(Stu)); p = L; p = p->next; int i, j; for(i = 0; i < L->size; i++){ p = L->next; for(j = 0; j < L->size - i - 1; j++){ if(p->s.marks < p->next->s.marks){ temp->s = p->s; p->s = p->next->s; p->next->s = temp->s; } p = p->next; } } free(temp); return L;}Stu* Change_Data(Stu* L)//修改数据{ int Lc; Stu *p = L; printf("please input number\n"); scanf("%d", &Lc); while(Lc > 0){ p = p->next; Lc--; } printf("please input new data\n"); p->s = input(); return L;}void* Num_Seek(Stu* L)//按学号寻找{ int Lc; printf("please input number\n"); scanf("%d", &Lc); while(L->s.num != Lc){ L = L->next; } printf("%d, %s, %lf\n", L->s.num, L->s.name, L->s.marks);}void Display(Stu *L)//遍历并显示链表信息{ printf("%d\n", L->size); L = L->next; while(L != NULL){ printf("%d, %s, %lf\n", L->s.num, L->s.name, L->s.marks); L = L->next; }}void Select(Stu *H){ int i = 1; while(i != 0){ printf(" please input 0 - 8\n"); scanf("%d", &i); switch(i){ case 1: H = Create_End(); break; case 2: H = Create_Front(); break; case 3: H = Insert(H); break; case 4: H = Delete(H); break; case 5: H = Sort(H); break; case 6: H = Change_Data(H); break; case 7: Num_Seek(H); break; case 8: Display(H); break; case 0: break; default: printf("please input correct number\n"); } }}void Menu(){}int main(){ Stu *H; H = (Stu*)malloc(sizeof(Stu)); Select(H); return 0;}/**创建链表时数据11 zwn 1.112 cpq 2.213 sxq 3.314 llx 4.415 zwl 5.516 chn 6.60 * */
阅读全文
0 0
- 单链表的操作(C语言描述)
- 数据结构:数组的操作(C语言描述)
- 数据结构:数组的操作(C语言描述)
- 栈的基本操作 用C语言描述
- C语言描述:单向链表的相关操作
- <数据结构与算法>二叉搜索树(BST)的基本操作(C语言描述)
- 栈的基本结构和基本操作(c语言描述)
- 【C语言】操作符描述,示例,优先级
- 数据结构(C语言描述)
- 单链表的实现操作(C语言)
- 数据结构与算法分析 C语言描述 单链表的实现
- 单链表的实现 来自算法精解-c语言描述
- C语言的编码风格-文件描述(1)
- 树的层次遍历(c语言描述)
- 归并排序的实现(排序算法c语言描述)
- C语言的简单介绍与描述(个人见解)
- 数据结构:栈的链式实现(C语言描述)
- 数据结构-二叉树的遍历(类C语言描述)
- VS打开白屏
- dojo/_base/declare模块
- DPM在windows下配置并使用自己标定的数据进行训练
- 前端调试工具
- 一步步教你怎么把vue项目部署到Node服务器上
- 单链表的操作(C语言描述)
- Leetcode 第二章线性表--2.2 单链表--2.2.1 add two numbers--2017/7/25
- AtCoder Grand Contest 018 F
- 剑指Offer——(40)数组中只出现一次的数字
- 大数据分布式集群搭建(8)
- PAT乙级 1018. 锤子剪刀布 (20)
- nginx 如何实现读写限流的方法
- BootstrapFileInput参数方法
- 1.19Android 学习+进度之十九-图片和语音