c语言-指针实现链表增删改查
2015-08-28 23:48
381 查看
通过指针实现链表增删改查。
1.首先定义宏以及结构体作为数据结构使用。
2.建立动态链表
3.输出链表
4.删除链表
5.插入链表
6.主函数
7.测试结果截图
1.首先定义宏以及结构体作为数据结构使用。
#define LEN sizeof(struct student) struct student{ long num; float score; struct student *next; }; int n;//为全局变量,本文件模块中各函数均可使用它
2.建立动态链表
struct student *create(void){//定义函数,此函数带回一个指向链表头的指针 struct student *head; struct student *p1,*p2; n = 0; p1 = p2 = (struct student *)malloc(LEN);//开辟一个新单元 scanf("%ld,%f",&p1->num, &p1->score); head = NULL; while (p1->num!=0) { n = n+1; if (n==1) { head = p1; }else { p2->next = p1; } p2 = p1; p1 = (struct student *)malloc(LEN); scanf("%ld,%f",&p1 -> num,&p1 -> score); } p2 -> next = NULL; return head; }
3.输出链表
//输出链表 void print(struct student *head){ struct student *p; printf("Now,These %d records are:\n",n); p = head; if (head!=NULL) { do { printf("%ld %5.1f\n",p->num,p->score); p = p->next; } while (p!=NULL); } printf("\n",n); }
4.删除链表
struct student *del(struct student *head,long num){ struct student *p1,*p2 = nullptr; if (head==NULL) { return head; } p1 = head; while (num!=p1->num&&p1->next!=NULL) {//p1指向的不是所要找的结点,并且后面还有结点 p2 = p1; p1 = p1 -> next; } if (num == p1 -> num) {//找到了 if (p1 == head) { head = p1 -> next; }else{ p2 ->next = p1 -> next; } n = n - 1; }else { //找不到该结点 } return head; }
5.插入链表
struct student * insert(struct student * head,struct student *stud){ struct student *p0,*p1,*p2 = nullptr; p1 = head;//使p1指向第一个结点 p0 = stud;//p0指向要插入的结点 if (head == NULL) {//原来的链表是空表 head = p0;//p0指向的结点作为头结点 p0 -> next = NULL; }else{ while ((p0 -> num > p1 -> num) && (p1 -> next != NULL)) { p2 = p1;//使p2指向刚才p1指向的结点 p1 = p1 -> next;//p1后移一个结点 } if (p0 -> num <= p1 -> num) { if (head == p1) { head = p0; //插到原来第一个结点之前 }else { p2 -> next = p0;//插到p2指向的结点之后 } p0 -> next = p1; }else{ p1 -> next = p0;//插到最后的结点之后 p0 -> next = NULL; } } n = n + 1;//结点数加1; return head; }
6.主函数
int main(int argc, const char * argv[]) { struct student * head,stu; long del_num; printf("input records:(建立链表)\n"); head = create();//建立链表,返回头指针 print(head);//输出全部结点 printf("input the deleted number(删除):\n"); scanf("%ld",&del_num); head = del(head, del_num);//删除后链表的头地址 print(head);//输出全部结点 printf("input records(插入结点):\n"); scanf("%ld,%f",&stu.num,&stu.score); head = insert(head, &stu);//插入一个结点,返回头结点地址 print(head);//输出全部结点 return 0; }
7.测试结果截图
相关文章推荐
- C++编程常用头文件及其包含函数汇总
- C/C++常用头文件及函数汇总
- [C语言][LeetCode][48]Rotate Image
- 如何成为一个牛逼的C/C++程序员?
- C/C++程序员必须熟练应用的开源项目
- [C语言][LeetCode][34]Search for a Range
- [C语言][LeetCode][35]Search Insert Position
- [C语言][LeetCode][73]Set Matrix Zeroes
- C++中string类常用函数
- [C语言][LeetCode][219]Contains Duplicate II
- C++中string的size,length,capacity三者到底有何区别求解啦?
- [C++11 并发编程] 15 承诺promise
- C++虚函数与纯虚函数的区别
- C++语言学习——LRJ入门经典笔记
- C++泛型 && Java泛型实现机制
- hdu2112 spfa
- C++软件
- 何时使用引用参数(c++ primer plus -6th)
- C语言的预处理命令
- 2015.08.28 C++笔记