单链表的操作

来源:互联网 发布:php 多图片上传插件 编辑:程序博客网 时间:2024/06/05 11:49

1、单链表:线性链表

插入:根据插入的位置,分3种,第一个结点前,最后一个结点后,插入在中间

删除:也同样分为3种,删除第一个结点,删除最后一个结点,删除中间的结点

#include <iostream>using namespace std;typedef struct LinkNode{int data;struct LinkNode *next;}LinkNode;//链表的创建LinkNode * CreateLink(){int i;LinkNode *head,*ptr,*p;head = (LinkNode*)malloc(sizeof(LinkNode)); //分配内存if(!head){printf("内存分配失败。");exit(1);}printf("请输入第1个数据:");scanf("%d",&head->data); head->next = NULL;ptr = head;for(i=1;i<5;i++){p = (LinkNode*)malloc(sizeof(LinkNode));if(!p){printf("内存分配失败!\n");exit(1);}printf("请输入第%d个数据:",i+1);scanf("%d",&p->data);p->next = NULL;ptr->next = p;ptr = ptr->next;}return head;}//查找链表结点LinkNode *FindNode(LinkNode *head,int num){LinkNode *ptr;ptr = head;while(ptr){if(ptr->data == num)return ptr;ptr = ptr->next;}return ptr;}//链表结点的插入LinkNode *InsertNode(LinkNode *head,LinkNode *ptr,int value){LinkNode *newnode = (LinkNode *)malloc(sizeof(LinkNode));if(!newnode) exit(1);newnode->data = value;newnode->next = NULL;if(ptr == NULL) //插入在表头{newnode->next = head;return newnode;}else{if(ptr->next == NULL) ptr->next = newnode;//插入在表尾else //插入在表中{newnode->next = ptr->next;ptr->next = newnode;}}return head;}//链表结点删除LinkNode * DeleteNode(LinkNode *head,LinkNode *ptr){LinkNode *pre; //指向前一结点if(ptr==head) //要删除的结点是头结点return head->next; //输出第二个结点的指针else{pre = head;while(pre->next!=ptr) //找要删除结点的前一个结点{pre = pre->next;}if(ptr->next==NULL) //要删除的结点是最后一个结点pre->next = NULL;elsepre->next = ptr->next;}free(ptr);//释放结点内存return head;}//链表输出void PrintNode(LinkNode *ptr){while(ptr!=NULL){printf("%d\t",ptr->data); //输出结点数据ptr = ptr->next;}printf("\n");}//链表的内存释放void FreeLinkNode(LinkNode *head){LinkNode *ptr;while(head!=NULL){ptr = head;head = head->next;free(ptr);}}void main(){int num,value;LinkNode *head,*ptr; //指向链表开始head = CreateLink(); //创建链表PrintNode(head); //输出链表printf("请输入要查找的数据:\n");scanf("%d",&num);ptr = FindNode(head,num);if(!ptr)printf("没有找到\n");else{printf("找到啦!\n请输入要插入的数据:\n");scanf("%d",&value);head = InsertNode(head,ptr,value);PrintNode(head); //输出链表}printf("请输入要查找并删除的数据:\n");scanf("%d",&num);ptr = FindNode(head,num);if(!ptr)printf("没有找到\n");else{printf("找到啦!\n");head = DeleteNode(head,ptr);PrintNode(head);}FreeLinkNode(head);system("pause");}

结果输出:


0 0
原创粉丝点击