- /*************************单链表的创建以及使用**********************************/
- #include <stdio.h>
- #include <stdlib.h>
- /********************单链表******************************/
- struct linknode /*链表结构声明*/
- {
- int data; /*存储结点数据*/
- struct linknode *next; /*指向下一个结点*/
- };
- typedef struct linknode LinkNode; /*定义新类型*/
- /***********************单链表的创建***************************/
- LinkNode *CreatLinkNode() /*链表的创建*/
- {
- int i;
- LinkNode *head,*ptr,*p; /*链表结点*/
- head = (LinkNode *) malloc(sizeof(LinkNode)); /*分配内存*/
- if(!head) /*检查指针内存是否分配成功*/
- {
- printf("内存分配失败!\n");
- exit(1); /*退出*/
- }
- printf("请输入第1个数据:");
- scanf("%d",&head->data ); /*创建结点内容*/
- head->next=NULL; /*设置指针初值*/
- ptr=head; /*ptr指向链表开始*/
- 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!=NULL) /*遍历链表*/
- {
- if(ptr->data == num) return ptr; /*查找编号*/
- ptr=ptr->next ; /*指向一下结点*/
- }
- return ptr;
- }
- /************************单链表的插入**************************/
- LinkNode *InsertNode(LinkNode *head,LinkNode *ptr,int vlaue) /*链表结点的插入*/
- {
- LinkNode *newnode=(LinkNode *)malloc(sizeof(LinkNode)); /*分配内存*/
- if(!newnode) return NULL;
- newnode->data=vlaue; /*创建结点内容*/
- 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; /*结点ptr指向新结点*/
- }
- }
- return head;
- }
- /************************单链表的删除**************************/
- LinkNode *DeleteNode(LinkNode *head,LinkNode *ptr) /*链表结点删除*/
- {
- LinkNode *pre; /*指向前一结点*/
- if(ptr==head) /*是否是链表的开始*/
- return head->next; /*输出第二个结点*/
- else
- {
- pre=head;
- while(pre->next !=ptr) /*找结点ptr的前结点*/
- pre=pre->next;
- if(ptr->next ==NULL) /*是否是链表的结束*/
- pre->next = NULL; /*最后一个结点*/
- else
- pre->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);
- }
- }
- /*************************主函数*************************/
- int main()
- {
- int num,value;
- LinkNode *head,*ptr; /*指向链表开始*/
- head = CreatLinkNode(); /*创建链表*/
- 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); /*释放链表*/
- return 0;
- }
复制代码
|