链表的插入、删除实例,C语言 结构体

合集下载

c++创建一个学生链表,进行链表的插入、删除、查找操作报告模板.链表

c++创建一个学生链表,进行链表的插入、删除、查找操作报告模板.链表

《面向对象程序设计》实验报告(一)一、实验项目名称:实验二C++语言对C语言的扩充二、实验目的及要求:1.掌握C++语言在结构化程序设计方面对C语言的扩充。

2.进一步掌握程序的调试方法。

三、实验环境及要求:多媒体计算机一台Windows XP操作系统Visual C++ 6.0四、实验原理及步骤:实验内容:3.创建一个学生链表,进行链表的插入、删除、查找操作,要求:(1)使用函数模板;(2)使用new和delete进行动态内存的分配和释放。

原理:运用结构体和动态链表来实现对学生信息的操作步骤:正常启动Microsoft Visual C++,输入程序进行调试,进过修改调试注意区分c++与的区别#include <string>using namespace std;struct student{int ID; //顺序long number;//学号string name;//学生姓名string sex; //性别int age; //年龄float score; //成绩student *next;};student *head;student *Create() //创建链表:初始化(当学号为'0'时停止){student *p1;student *p2;p1=new student;cin>>p1->number>>p1->name>>p1->sex>>p1->age>>p1->score;head=NULL;p2=p1;while(p1->number!=0){if(head==NULL)head=p1;elsep2->next=p1;p2=p1;p1=new student;cin>>p1->number>>p1->name>>p1->sex>>p1->age>>p1->score;}p2->next=NULL;delete p1;return(head);}int Length(student *head) //计算学生总数{int length=0;while(head){length++;head=head->next;}return length;}void Search(student *head,long key)//按学号查找学生信息{student *p;if(head==NULL){cout<<endl<<"空表,不能查找。

c语言数据结构之单链表的插入和删除操作

c语言数据结构之单链表的插入和删除操作

c语⾔数据结构之单链表的插⼊和删除操作1,定义⼀个单链表基础定义先了解⼀下:struct LNode{ //定义单链表结点类型ElemType data; //每个节点存放⼀个数据元素struct LNode *next; //指针指向下⼀个节点}LNode,*LinkList;/*struct LNode *p=(struct LNode*)malloc(sizeof(struct LNode)); //增加⼀个新的结点,在内存中申请⼀个结点所需的空间,并⽤指针p 指向这个结点*/LNode *GetElem(LinkList L,int i){int j=1;LNode *p=L->next;if(i==0)return L;if(i<1)return NULL;while(p!=NULL&&j<i){p=p->next;j++;}return p;}上述代码*LNode GetElem(LinkList L,int i)中需要注意的是:若强调这是⼀个单链表,使⽤ LinkList;若强调这是⼀个结点,则使⽤LNode *。

1,不带头结点的单链表struct LNode{ //定义单链表结点类型ElemType data; //每个节点存放⼀个数据元素struct LNode *next; //指针指向下⼀个节点}LNode,*LinkList;bool InitList(LinkList &L){ //初始化⼀个单链表L=NULL; //空表,防⽌脏数据return true;}void test(){LinkList L; //声明⼀个指向单链表的指针//初始化⼀个空表InitList(L);//.....}2,带头结点的单链表struct LNode{ //定义单链表结点类型ElemType data; //每个节点存放⼀个数据元素struct LNode *next; //指针指向下⼀个节点}LNode,*LinkList;//初始化⼀个单链表bool InitList(LinkList &L){L=(LNode *)malloc(sizeof(LNode)); //分配⼀个头结点if(L==NULL) //内存不⾜,分配失败return false;L->next=NULL; //头结点之后暂时还没有结点return true;}//判断单链表是否为空(带头结点)bool Empty(LinkList L){if(L-next==NULL)return true;elsereturn false;}void test(){LinkList L; //声明⼀个指向单链表的指针//初始化⼀个空表InitList(L);//.....2,单链表的基本操作1,插⼊1,按位序插⼊(ListInsert(&L,i,e))在第i 个位置插⼊元素e (带头结点)bool ListInsert(LinkList &L,int i,ElemType e){if(i<1)return false;LNode *p; //指针p 指向当前扫描到的节点int j=0; //当前p指向的是第⼏个结点p=L; //L指向头结点,头结点是第0 个结点(不存数据)while(p!=NULL&&j<i-1){ //循环找到第i-1个结点p=p->next;j++;}if(p==NULL) //i 值不合法return false;LNode *s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s; //将结点s 连到p 之后return true; //插⼊成功}不带头结点的:(不存在 “第0个“ 结点)实现代码如下:bool ListInsert(LinkList &L,int i,ElemType e){if(i<1)return false;if(i==1){ //插⼊第1个结点的操作与其他结点操作不同LNode *s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=L;L=s; //头指针指向新结点return true;}LNode *p; //指针p指向当前扫描到的节点int j=1; //当前p 指向的是第⼏个结点p=L; //p指向第1个结点(注意:不是头结点)while(p!=NULL&&j<i-1){ //循环找到第i-1个结点p=p->next;j++;}if(p==NULL) //i 值不合法return false;LNode *s=(LNode *)malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s; //将结点s 连到p 之后return true; //插⼊成功}2,指定结点的后插操作(InsertNextNode(LNode *p,ElemType e)在p 结点之后插⼊元素e :bool InsertNextNode(LNode *p,ElemType e){if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode));if(s==NULL) //内存分配失败return false;s->data=e; //⽤结点s保存数据元素es->next=p->next;p->next=s;}3,指定结点的前插操作在p 结点之前插⼊**元素e **:bool InsertPrioNode(LNode *p,ElemType e){if(p==NULL)return false;LNode *s=(LNode *)malloc(sizeof(LNode));if(s==NULL) //内存分配失败return false;s->next=p->next;p->next=s; //新结点s 连接到p 之后s->data=p->data; //将p 中元素复制到s 中p->data=e; //p 中元素覆盖为ereturn true;}结合下图在体会⼀下:下⾯再看⼀下在p 结点之前插⼊**结点s **:bool InsertPrioNode(LNode *p,ElemType e){if(p==NULL||s==NULL)return false;s->next=p->next;p->next=s; //s 连接到p 之后ElemType temp=p->data; //交换数据域部分p->data=s->data;s->data=temp;return true;}这招偷天换⽇结合下图好好体会⼀下:2,删除1,按位序删除(带头结点)删除表L 中第i 个位置的元素,并⽤e 返回删除元素的值。

C语言单链表的基本操作(增删改查)

C语言单链表的基本操作(增删改查)

C语⾔单链表的基本操作(增删改查)这是尾插法单链表,单链表⽐较适合⽤来做队列和栈,因为在链表的头和尾时的增删改查的时间复杂度为O(1),⽽在链表内部的增删改查的平均时间复杂度为O(n)。

#include "stdio.h"#include "stdlib.h"//提供malloc()和free()#include "string.h"#include "time.h"//提供strcpy(),time()等//1.⽤结构体创建链表节点//⼀个⽤来存放数据,另⼀个存放指针struct Node{int data; //数据域struct Node* next; //指针域(指向节点的指针)};//2.全局定义链表头尾指针,⽅便调⽤struct Node* head = NULL;struct Node* end = NULL;//3.向链表添加数据void AddListTill(int a ){//创建⼀个节点struct Node* temp = (struct Node*)malloc(sizeof(struct Node)); //此处注意强制类型转换//节点数据进⾏赋值temp->data = a;temp->next = NULL;//连接分两种情况1.⼀个节点都没有2.已经有节点了,添加到尾巴上if(NULL == head){head = temp;//end=temp;}else{end->next=temp;//end=temp; //尾结点应该始终指向最后⼀个}end=temp; //尾结点应该始终指向最后⼀个}//4.遍历链表并输出void ScanList(){struct Node *temp = head; //定义⼀个临时变量来指向头while (temp != NULL){printf("%d\n",temp->data);temp = temp->next; //temp指向下⼀个的地址即实现++操作}}//5.查找指定的数据是否在链表内struct Node* FindNode(int a ){struct Node *temp = head;while(temp != NULL){if(a == temp->data){return temp;}temp = temp->next;}//没找到return NULL;}//6.删除链表void FreeList(){struct Node *temp = head; //定义⼀个临时变量来指向头while (temp != NULL){struct Node* pt = temp;temp = temp->next; //temp指向下⼀个的地址即实现++操作free(pt); //释放当前}//头尾清空,不然下次的头就接着0x10head = NULL;end = NULL;}//7.在指定位置处插⼊数据void AddListRand(int index,int a){if (NULL == head){printf("链表没有节点\n");return;}struct Node* pt = FindNode(index);if(NULL == pt) //没有此节点{printf("没有指定节点\n");return;}//有此节点//创建临时节点,申请内存struct Node* temp =(struct Node *)malloc(sizeof(struct Node));//节点成员进⾏赋值temp->data = a;temp->next = NULL;//连接到链表上 1.找到的节点在尾部 2.找到的节点在中间if (pt == end){//尾巴的下⼀个指向新插⼊的节点end->next = temp;//新的尾巴end = temp;}else{//先连后⾯(先将要插⼊的节点指针指向原来找到节点的下⼀个) temp->next = pt->next;//后连前⾯pt->next = temp;}}//8.删除链表末尾数据void DeleteListTail(){if (NULL == end){printf("链表为空,⽆需删除\n");return;}//链表不为空//链表有⼀个节点if (head == end){free(head);head = NULL;end = NULL;}else{//找到尾巴前⼀个节点struct Node* temp = head;while (temp->next != end){temp = temp->next;}//找到了,删尾巴//释放尾巴free(end);//尾巴迁移end=temp;//尾巴指针为NULLend->next = NULL;}}//9.删除链表的第⼀个数据void DeleteListHead(){ //记住旧头struct Node* temp = head;//链表检测if (NULL == head){printf("链表为空\n");return;}head = head->next; //头的第⼆个节点变成新的头free(temp);}//10.删除链表指定的数据void DeleteListRand(int a){//链表判断是不是没有东西if(NULL == head){printf("链表没东西\n");return;}//链表有东西,找这个节点struct Node* temp = FindNode(a);if(NULL == temp){printf("查⽆此点\n");return;}//找到了,且只有⼀个节点if(head == end){free(head);head = NULL;end = NULL;}else if(head->next == end) //有两个节点{//看是删除头还是删除尾if(end == temp){DeleteListTail();}else if(temp == head){DeleteListHead();}}else//多个节点{//看是删除头还是删除尾if(end == temp)DeleteListTail();else if(temp == head)DeleteListHead();else//删除中间某个节点{ //找要删除temp前⼀个,遍历struct Node* pt = head;while(pt->next != temp){pt=pt->next;}//找到了//让前⼀个直接连接后⼀个跳过指定的即可 pt->next = temp->next;free(temp);}}}//主函数void main(){struct Node *pFind;srand((unsigned)time(NULL));int i;//创建20个节点for(i = 0; i < 20; i++)AddListTill(i); //添加数据//AddListTill(rand());AddListRand(4,86); //在指定位置4增加节点14//DeleteListHead(); //删除⼀个头结点//DeleteListTail(); //删除⼀个尾结点DeleteListRand(4); //删除4节点ScanList(); //遍历输出链表//FreeList(); //删除链表pFind = FindNode(5); //查找5节点if (pFind != NULL){printf("找到%d\n",pFind->data); //找到节点并且输出该节点数据 }else{printf("No Find!\n");}}以下是排序算法的时间和空间复杂度表:。

第8次课--链表结点的插入和删除

第8次课--链表结点的插入和删除
第8次课----链表结点的插入和删除
第7章
首页
《C语言与数据结构》
第8次课----链表结点的插入和删除
第7章
教案
教学主题 链表结点的插入和删除 通过本次课的学习,使学生掌握单链表中结点 的插入与删除方法。 1.单链表中结点插入算法的实现 2.单链表中结点删除算法的实现 考虑带附加头结点和不带附加头结点两种情况
第8次课----链表结点的插入和删除
第7章
单链表结点的插入(4)
在值为x的结点前插入一个值为y的结点 步骤: (1)申请一个结点空间,用q指向它,并把y放入其中。 (2)在链表中查找值为x的结点,找到后用p指向它,pf 指向它的前驱结点。 (3)在pf结点后插入q结点。 实现语句(两种方法):
看源程序 (8_5)
《C语言与数据结构》
第8次课----链表结点的插入和删除
第7章
单链表结点删除举例
【补例】在【例7-5】的基础上增加删除功能。 分析 删除时,按照以下几种情况进行: (1)删除链首结点。 (2)删除链尾结点。 (3)删除指定值的结点。
《C语言与数据结构》
第8次课----链表结点的插入和删除
看源程序 (8_2)
看源程序 (8_3)
《C语言与数据结构》
第8次课----链表结点的插入和删除
第7章
单链表结点插入举例
【补例】将【例7-5】改成用菜单选择实现,并在此基础上增 加插入功能。 分析 插入时,按照以下几种情况进行: (1)插入到链首。 (2)插入到链尾。 (3)插入到指定值的后面。 (4)插入到指定值的前面。
看源程序 (8_4)
运行程序 (8_4)
思考:不用附加头结 点,任何修改?(8_6)

【IT专家】用c语言完成一个双向链表的创建,插入,删除

【IT专家】用c语言完成一个双向链表的创建,插入,删除

本文由我司收集整编,推荐下载,如有疑问,请与我司联系用c 语言完成一个双向链表的创建,插入,删除2014/09/13 2471 /*dlist.h*/#ifndef DList_H #define DList_H typedef int Item; typedef struct Node * PNode; //节点指针typedef PNode Position; //节点位置/*定义节点类型*/ typedef struct Node { Item data; /*数据域*/ PNode previous; /*指向前驱*/ PNode next; /* 指向后继*/ }Node; /*定义链表类型*/ typedef struct { PNode head; /*指向头节点*/ PNode tail; /*指向尾节点*/ int size; //链表长度}DList; /*分配值为i 的节点,并返回节点地址*/ Position MakeNode(Item i); /*释放p 所指的节点*/ void FreeNode(PNode p); /*构造一个空的双向链表*/ DList* InitList(); /*删除一个双向链表*/ void DestroyList(DList *plist); /*将一个链表置为空表,释放原链表节点空间*/ void ClearList(DList *plist); /*返回头节点地址*/ Position GetHead(DList *plist); /*返回尾节点地址*/ Position GetTail(DList *plist); /*返回链表大小*/ int GetSize(DList *plist); /*返回p 的直接后继位置*/ Position GetNext(Position p); /*返回p 的直接前驱位置*/ Position GetPrevious(Position p); /*将pnode 所指节点插入第一个节点之前*/ PNode InsFirst(DList *plist,PNode pnode); /*将链表第一个节点删除并返回其地址*/ PNode DelFirst(DList *plist); /*获得节点的数据项*/ Item GetItem(Position p); /*设置节点的数据项*/ void SetItem(Position p,Item i); /*删除链表中的尾节点并返回其地址,改变链表的尾指针指向新的尾节点*/ PNode Remove(DList *plist); /*在链表中p 位置之前插入新节点S*/ PNode InsBefore(DList *plist,Position p,PNode s); /*在链表中p 位置之后插入新节点s*/ PNode InsAfter(DList *plist,Position p,PNode s); /*返回在链表中第i 个节点的位置*/ PNode LocatePos(DList *plist,int i); /*依次对链表中每个元素调用函数visit()*/ void ListTraverse(DList *plist,void (*visit)()); /*打印data*/ void print(Item data); #endif/*dlist.c*/。

单链表的建立、插入和删除

单链表的建立、插入和删除

单链表的建立、插入和删除单链表的建立插入删除#include<stdio.h>#include<stdlib.h>/*线性表*/struct TLink {int data;struct TLink * next;};/*end struct TLink*//*生成新元素*/struct TLink * new_item(int number){struct TLink * r = 0;r = (struct TLink *)malloc(sizeof(struct TLink));r->data = number;r->next = 0;return r;}/*end new_item*//*在线性表中查询数据*/struct TLink * lookup(struct TLink * root, int number) {struct TLink * h = root;while(h) {if (h->data == number) return h;h = h->next ;}/*end lookup*/return 0;}/*在线性表中追加一个数据*/void append(struct TLink * * root, int number){struct TLink * r = 0, * n = 0;if (!root) return ;/*不记录重复元素*/if (lookup(*root, number)) return;/*如果表为空则新建表*/r = *root;if (!r) {*root = new_item(number);return ;}/*end if*//*为保证为有序线性表,如果数据比表头还小则作为表头*/ if (number < r->data ) {n = new_item(number);n->next = r;*root = n;return ;}/*end if*//*在有序线性表中查找位置插入元素*/while(r) {n = r->next ;/*如果已经是表尾则直接追加*/if (!n) {n = new_item(number);r->next = n;return ;}/*end if*//*在中央某处插入*/if (number < n->data ) {r->next = new_item(number);r->next->next = n;return ;}/*end if*/r = n;}/*end while*/}/*end append*//*打印有序线性表*/void print(struct TLink * root){struct TLink * r = root;printf("【");while(r) {printf("%d ", r->data );r = r->next ;}/*end while*/printf("\b】\n");}/*end print*//*将有序线性表h1合并至有序线性表h0,并销毁线性表h1*/ void merge(struct TLink ** h0, struct TLink ** h1){struct TLink * h = 0, * k = 0;if (!h0 || !h1) return ;h = *h1;while(h) {append(h0, h->data );k = h;h = h->next ;free(k);}/*end h*/h1 = 0;}int main(void){int i = 0; struct TLink * x=0, *y = 0;int a[] = {8,4,3,9,5,1};int b[] = {7,2,1,5,6,0};printf("原数据为:\n数组A:【");for(i = 0; i < 6; i++) {printf("%d ", a[i]);append(&x, a[i]);}/*next*/printf("\b】\n数组B:【");for(i = 0; i < 6; i++) {printf("%d ", b[i]);append(&y, b[i]);}/*next*/printf("\b】\n转换为有序线性表\nA:");print(x);printf("B:");print(y);printf("AB合并后为:");merge(&x, &y);print(x);return 0;}。

链表的插入与删除

链表的插入与删除

#define NULL 0#include "stdlib.h"#include"stdio.h"//结构体定义typedef struct LNode{int data;struct LNode *next;} LNode, *LinkList;//函数声明void CreateList_L( LinkList *L);void ShowList(LinkList *L);LNode *GetElem(LinkList head);void InsertList(LinkList *head);void DeleteList(LinkList head);//主函数void main(){ LNode *L;int j,loop=1;printf("\n");while(loop){printf("1----建立单链表\n");printf("2----在单链表中查询\n");printf("3----在单链表插入元素\n");printf("4----删除单链表元素\n");printf("请选择序号(1-4): ");scanf("%d",&j);switch(j){case 1:CreateList_L(&L);break;case 2:CreateList_L(&L);if(GetElem(L)) printf("------suceed!-------\n");else printf("------not exists!-------\n");break;case 3:CreateList_L(&L);InsertList(&L);break;case 4:CreateList_L(&L);DeleteList(L);break;}printf("结束此练习吗?(0——结束1——继续):\n");scanf("%d",&loop);printf("\n");}}//创建单链表void CreateList_L( LinkList *L){ LNode *p;int flag=1;(*L)=(LinkList)malloc(sizeof(LNode));(*L)->next=NULL;printf("qing shu ru lian biao yuan su(yi 0 jie shu):\n");while(flag){p=(LinkList)malloc(sizeof(LNode));p->next=NULL;scanf("%d",&p->data);if (p->data==0)break;p->next=(*L)->next;(*L)->next=p;}ShowList(L);}//显示单链表void ShowList(LinkList *L){LinkList p;printf("tou jie dian-> ");for(p=(*L)->next;p!=NULL;p=p->next){printf("%d -> ",p->data);}printf("NULL !\n");}//单链表查找LNode *GetElem(LinkList head){/*在带头结点的单链表查找第i个结点*/int i,j;LNode *p;printf("input locate position:");scanf("%d",&i);p=head;j=0; /*从头结点开始扫描*/while(p->next!=NULL && j<i){p=p->next; /*扫描下一结点*/j++;} /*已扫描结点计数*/if(i==j && i!=0) return p; /*找到第i个结点*/else return NULL; /*当i<=0或i>n时找不到*/ }//单链表插入void InsertList(LinkList *head){LNode *pre,*s;int i,j,x;printf("input insert position:");scanf("%d",&i);printf("input insert value:");scanf("%d",&x);pre=*head;j=0;while (pre!=NULL && j<i-1){pre=pre->next; j++;}s=(LNode *)malloc(sizeof(LNode));s->data=x;s->next=pre->next;pre->next=s;ShowList(head);printf("\n");}//单链表删除void DeleteList(LinkList head){LNode *pre,*r;int i,j;pre=head;printf("input delete position:"); scanf("%d",&i);j=0;/*查找第i-1个结点*/while(pre->next!=NULL && j<i-1) {pre=pre->next; j++; }r=pre->next;pre->next=r->next ;free(r);ShowList(&head);}。

「C语言」单链表双向链表的建立遍历插入删除

「C语言」单链表双向链表的建立遍历插入删除

「C语⾔」单链表双向链表的建⽴遍历插⼊删除最近临近期末的C语⾔课程设计⽐平时练习作业⼀下难了不⽌⼀个档次,第⼀次接触到了C语⾔的框架开发,了解了View(界⾯层)、Service(业务逻辑层)、Persistence(持久化层)的分离和耦合,⼀种⾯向过程的MVC的感觉。

⽽这⼀切的基础就在于对链表的创建、删除、输出、写⼊⽂件、从⽂件读出......本篇⽂章在于巩固链表的基础知识(整理⾃《C语⾔程序设计教程--⼈民邮电出版社》第⼗章——指针与链表),只对链表的概念及增删改查作出探讨,欢迎指教。

⼀、链表结构和静态/动态链表⼆、单链表的建⽴与遍历三、单链表的插⼊与删除四、双向链表的概念五、双向链表的建⽴与遍历六、双向链表的元素查找七、循环链表的概念⼋、合并两个链表的实例九、链表实战拓展思维、拉到最后去看看 (•ᴗ•)و⼀、链表结构和静态/动态链表链表是⼀种常见的数据结构——与数组不同的是:1.数组⾸先需要在定义时声明数组⼤⼩,如果像这个数组中加⼊的元素个数超过了数组的长度时,便不能正确保存所有内容;链表可以根据⼤⼩需要进⾏拓展。

2.其次数组是同⼀数据类型的元素集合,在内存中是按⼀定顺序连续排列存放的;链表常⽤malloc等函数动态随机分配空间,⽤指针相连。

链表结构⽰意图如下所⽰:在链表中,每⼀个元素包含两个部分;数据部分和指针部分。

数据部分⽤来存放元素所包含的数据,指针部分⽤来指向下⼀个元素。

最后⼀个元素的指针指向NULL,表⽰指向的地址为空。

整体⽤结构体来定义,指针部分定义为指向本结构体类型的指针类型。

静态链表需要数组来实现,即把线性表的元素存放在数组中。

数组单元存放链表结点,结点的链域指向下⼀个元素的位置,即下⼀个元素所在数组单元的下标。

这些元素可能在物理上是连续存放的,也有可能是不连续的,它们之间通过逻辑关系来连接——这就要涉及到数组长度定义的问题,实现⽆法预知定义多⼤的数组,动态链表随即出现。

动态链表指在程序执⾏过程中从⽆到有地建⽴起⼀个链表,即⼀个⼀个地开辟结点和输⼊各结点的数据,并建⽴起前后相连的关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("请输入:");
scanf("%d",&choose);
switch (choose)
{
case 1:
{
printf("请输入要在第几个节点前插入数据:");
scanf("%d",&num);
printf("请输入要插入的数据:");
scanf("%d",&data);
if(Insert_Node(pHead,num,data) == true)
}
while(i < back-1)
{
_node = _node->pNext;
++i;
}
pSwap = _node->pNext;
data = pSwap->member;
_node->pNext = _node->pNext->pNext;
free(pSwap);
return data;
}
{
_node = _node->pNext;
++i;
}
pNode pNew = (pNode)malloc(sizeof(Node));
pNew->member = data; //把输入的数据赋给要插入的节点
pSwap = _node->pNext; //把下一个节点的地址,给用于交换的pSwap
{
printf("%d ",p->member);
p = p->pNext;
}
printf("\n");
return ;
}
//链表节点插入函数
//第一个参数是头节点,第二个参数是要在第几个节点前插入,第三个参数是要插入的数据
bool Insert_Node(pNode pHead, int front,int data)
_node->pNext = pNew; //把要插入的节点的地址,给上个节点的指针域
pNew->pNext = pSwap; //把插入节点的下一个节点的地址,给插入节点的指针域
return true;
}
//删除链表节点函数
//第一个参数是头节点,第二个参数是要删除第几个节点·······和上面的插入函数是不是很像
int Del_Node(pNode pHead,int back)
{
int i = 0;
int data;
pNode _node = pHead;
pNode pSwap;
if ((back < 1) && (NULL == _node->pNext))
{
printf("删除失败!\n");
return 0;
scanf("%d",&num);
return_val = Del_Node(pHead,num);
if (return_val == 0)
{
printf("删除失败。\n");
}
else
{
printf("删除成功。删除的元素是:%d\n",return_val);
}
printf("操作完成后的数据是:");
{
int i = 0;
pNode _node = pHead;
pNode pSwap; //用于交换
if ((front < 1) && (NULL != _node)) //判断用户输入的数据是否大于等于1,及_node是否为空
{
return false;
}
while (i < front - 1) //通过循环使指针指向要插入哪个节点前的节点。说的自己都不懂了,还是看下面的图吧。
TraverseList(pHead);
}
}
return 0;
}
//创建链表函数
pNode CrБайду номын сангаасateList()
{
int i; //用于下面循环
int len; //用来存放有效节点的字数
int val; //用于临时存放用户输入的数据
pNode pHead = (pNode)malloc(sizeof(Node)); //分配一个不存放有效数据的头结点
pHead = CreateList(); //创建一个非循环单链表,并将该链表的头结点的地址付给pHead
printf("你输入的数据是:");
TraverseList(pHead); //调用遍历链表函数
printf("是否还要进行如下操作:\n");
printf("1.插入数据2.删除数据\n");
int main()
{
pNode pHead = NULL; //定义初始化头节点,等价于struct Node *pHead == NULL
int data; //作为Insert_Node函数的第三个参数
int num; //作为Inset_Node函数第二个参数
int choose;
int return_val;
pTail = pNew; //将新节点赋给最后的一个节点
}
return pHead; //返回头节点
}
//遍历链表函数
void TraverseList(pNode pHead)
{
pNode p = pHead->pNext; //将头节点的指针给予临时节点p
while(NULL != p) //节点p不为空,循环
pNode pTail = pHead; //链表的最后一个节点
pTail->pNext = NULL; //最后一个节点的指针置为空
printf("请输入节点个数:");
scanf("%d",&len);
for(i = 0; i < len; i++)
{
printf("第%d个节点的数值:",i+1);
{
printf("插入成功\n插入后的数据是:\n");
TraverseList(pHead);
}
else
{
printf("插入失败\n");
}
printf("操作完成后的数据是:");
TraverseList(pHead);
break;
}
case 2:
{
printf("请输入要删除第几个节点的数据:");
scanf("%d",&val);
pNode pNew = (pNode)malloc(sizeof(Node)); //为节点分配空间
pNew->member = val; //将用户输入的数据赋给节点的成员
pTail->pNext = pNew; //将最后一个节点的指针指向下一个新的节点
pNew->pNext = NULL; //将新节点中的指针置为空
相关文档
最新文档