单链表的各种操作(建立,查找,删除,插入,归并等)

来源:互联网 发布:vnc软件下载 编辑:程序博客网 时间:2024/05/17 23:34
#include <stdio.h>#include <stdlib.h>#define OK 1#define ERROR 0typedef int datatype ;typedef struct node{datatype data;struct node *next;}listnode , *linklist;int length;//表长linklist create_list(int len)//建立链表(尾插法){linklist head = (linklist)malloc(sizeof(linklist));//设立一个头结点listnode *p,*rear;rear = head;while(len --){p = (listnode*)malloc(sizeof(listnode));scanf("%d",&p->data);rear->next = p; rear = p;}rear->next = NULL;return (head);}/*-----------------------------------------------------------------------------//头插法(建好的链表元素顺序与输入的顺序相反)linklist create_list(int len){linklist head = (linklist)malloc(sizeof(linklist));//设立一个头结点listnode *p;head->next= NULL;while(len --){p = (listnode*)malloc(sizeof(listnode));scanf("%d",&p->data);p->next = head->next;head->next = p;}return (head);}-----------------------------------------------------------------------------*/int insert_list(linklist head,int e,int m)//插入 {if(m < 1||m > length + 1)return ERROR;listnode *p = head,*r;int i = 1;while(i < m){p = p->next;i++;}r = (listnode*)malloc(sizeof(listnode));r->data = e;r->next = p->next;p->next = r;length ++;return OK;} int del_list(linklist head,int m)//删除 {if(m < 1||m > length)return ERROR;int j = 0;listnode *p = head,*r;while(p->next && j < m-1){p = p->next;j ++;}if(j > m-1 || p->next == NULL)return ERROR;r = p->next;p->next = r->next;free(r);length --;return OK;}int get_list(linklist head,int e)//(按址)查找 {linklist p = head;int i = 0;while(p->next){i ++;p = p->next;if(p->data == e)break;}if(p->data == e)return i;return 0;}void print_list(linklist head)//打印 {linklist p = head;printf("当前链表为:");if(p->next == NULL){        printf("空表!\n");        return ;    }while(p->next){         p = p->next;printf("%d ",p->data);}printf("\n当前表长度为:  %d\n",length);}int empity_list(linklist head)//判定是否为空表 {if(head->next)return OK;return ERROR;}int clear_list(linklist head)//清空 {listnode *p = head,*r;while(p->next){r = p->next;p->next = r->next;free(r);}if(p->next)return ERROR;length = 0;return OK;}int main(int argc, char *argv[]){linklist head = NULL;int n,i,e;printf("请输入要创建链表的长度:");scanf("%d",&length);printf("输入%d个数据并以空格隔开\n",length);head = create_list(length);        printf(head != NULL ? "创建成功!" : "创建失败!");print_list(head);printf("输入要删除的个数:");scanf("%d",&n);for(i = 1;i <= n;i ++){printf("输入第%d个元素所在位置\n",i);scanf("%d",&e);if(!del_list(head,e))printf("删除失败,检查数据是否有误!\n");else printf("删除成功!\n");print_list(head);}printf("输入要插入的元素个数:");scanf("%d",&n);        int loc;for(i = 1;i <= n;i ++){printf("输入第%d个要插入的元素及要插入的位置,以空格隔开!\n",i);scanf("%d%d",&e,&loc);printf(insert_list(head,e,loc) ? "插入成功!\n" : "插入失败,检查数据是否有误!\n");print_list(head);}printf("输入要查找的元素个数:");scanf("%d",&n);for(i = 1;i <= n;i ++){printf("输入第%d个要查找的元素\n",i);scanf("%d",&e);int m = get_list(head,e);if(!m)printf("表中不存在此元素!\n");else printf("表中第%d个节点中的元素!\n",m); }print_list(head);getchar(); printf("是否清空链表?y/n \n");char ch;scanf("%c",&ch);if(ch == 'y'){clear_list(head);printf(empity_list(head) ? "清空失败!\n" : "清空成功!\n");}print_list(head);printf("操作结束!\n");system("PAUSE");return 0;}/*--------------------------------------------------------------PS:归并两个链表linklist bing_list(linklist head1,linklist head2){if(head2->next == NULL)return (head1);linklist p = head1,q = head2;while(p->next)p = p->next;p->next = head2->next;return (head1);}---------------------------------------------------------------*/

原创粉丝点击