链表的增、删、改、查
-
linklist.c
#include<stdio.h> #include<stdlib.h> #include"linklist.h" /* 功能:创建链表 返回值:链表的头指针 */ Node *create() { Node *first = NULL; //给头、尾结点的地址初始值赋空值、因为还不存在 Node *last = NULL; element x; //输入的数据 printf("请输入链表数据,以空格隔开,以0结尾。\n"); while(1) { scanf("%d",&x); if(x == 0) //输入0结束输入 { break; } Node *p = (Node *)malloc(sizeof(Node)); //为新结点分配空间 p->data = x; //为新结点赋值 p->next = NULL; //插入新结点,分情况讨论 if(first == NULL) //放在第一个位置 { first = p; last = p; } else //尾插法 { last->next = p; last = p; } } return first; } /* 功能:打印链表 参数:@first:头指针 */ void *printflist(Node *first) { Node *p = first; while(p) { printf("%d",p->data); p = p->next; } printf("\n"); free(p); } /* 功能:在升序的链表中插入一个新结点,使链表依然升序 参数:@first:未插入前链表的头指针;@data:需要插入的数据 返回值:新链表的头结点 */ Node *insertlist(Node *first,element data) { Node *p = (Node *)malloc(sizeof(Node)); p->data = data; p->next = NULL; Node *q = first; //q保存第一个结点 Node *r = NULL; //r保存q前面的一个结点 //找插入点 while(q) { if(q->data > p->data) { break; } r = q; q = q->next; } //插入结点,分情况讨论 if(first == q) //没有比新结点小的 { p->next = q; first = p; } else if(q == NULL) //没有比新结点大的 { r->next = p; p->next = NULL; } else { r->next = p; p->next = q; } return first; } /* 功能:删除需要删除的数 参数:@first:链表的头指针;@data:需要删除的数 返回值:头结点 */ Node *deletelist(Node *first,element data) { while(1) { Node *q = first; Node *r = NULL; //找要删除的数 while(q) { if(q->data == data) { break; } r = q; q = q->next; } if(q == first) //第一个结点待删除 { first = q->next; //头指针指向第二个结点 q->next = NULL; //q的下一个指向空,断掉 free(q); } else if(q->next == NULL) //最后一个结点待删除 { r->next = NULL; //最后一个结点指向空 free(q); } else { r->next = q->next; q->next = NULL; free(q); } } return first; } /* 功能:修改链表中的某个数 参数:@first:头指针;@data:待修改的数;@x:修改成什么数 */ void *changelist(Node *first,element data,element x) { Node *q = first; Node *r = NULL; while(q) { if(q->data == data) { q->data = x; } r = q; q = q->next; } printf("链表中不存在要修改的数。\n"); } /* 功能:查找链表中的某个数 参数:@first:头指针;@data:查找的数 */ void *findlist(Node *first,element data) { Node *q = first; while(q) { if(q->data == data) { printf("找到了%d\n",data); } q = q->next; } printf("链表中不存在%d\n",data); }
-
main.c
#include<stdio.h> #include"linklist.h" int main() { //1、创建链表 Node *first = create(); //2、打印链表 printflist(first); //3、增 element data1; printf("请输入要插入的数:\n"); scanf("%d",&data1); first = insertlist(first,data1); printflist(first); //4、删 element data2; printf("请输入要插入的数:\n"); scanf("%d",&data2); first = deletelist(first,data2); printflist(first); //5、改 element data3,x; printf("请输入要修改的数:\n"); scanf("%d",&data3); printf("请输入修改为的数:\n"); scanf("%d",&x); first = changelist(first,data3,x); printflist(first); //6、查 element data4; printf("请输入要查找的数:\n"); scanf("%d",&data4); findlist(first,data4); return 0; }
-
linklist.h
#ifndef __LINKLIST_H__ #define __LINKLIST_H__ #define element int typedef struct node { element data; struct node *next; }Node; /* 功能:创建一个链表,输入0结束 返回值:头指针 */ Node *create(); /* 功能:打印链表 参数:@first 头指针 */ void printflist(Node *first); /* 功能: 给升序的链表增加一个新的结点,使链表仍然升序 参数: @first: 头指针 @data: 待插入的数据 返回值: 头指针 */ Node *insertlist(Node *first,element data); /* 功能:删除需要删除的数 参数:@first:链表的头结点;@data:需要删除的数 返回值:头指针 */ Node *deletelist(Node *first,element data); /* 功能:修改链表中的某个数 参数:@first:头指针;@data:待修改的数;@x:修改成什么数 */ void *changelist(Node *first,element data,element x); /* 功能:查找链表中的某个数 参数:@first:头指针;@data:查找的数 */ void *findlist(Node *first,element data); #endif
-