单链表综合操作
2014-02-16 14:06
281 查看
#include <stdio.h> #include <stdlib.h> #include <conio.h> /*构建结点结构体 */ typedef struct LNode{ int data; struct LNode * next; }LNode, * LinkList; /*用于创建链表的函数 */ /*反序构建的*/ LinkList CreateList_L(LinkList L, int n) { int i; LinkList p; L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; //创建一个空表 for(i = n; i > 0; --i) { p = (LinkList)malloc(sizeof(LNode)); scanf("%d",&p->data); p->next = L->next; // 在头部进行插入,创建的第二个节点讲师末尾的节点 L->next = p; //讲L的next的位置给新P的的next,将新p的位置赋值给L的next } return L; } /* 用于插入结点的函数 */ LinkList ListInsert_L(LinkList L, int i, int newnode)//参数 长度,位置,数值 { LinkList p = L; LinkList s; int j = 0; while(p&&j<i-1) //将指针位置移到需要创建位置的前面 { p = p->next; ++j; } if(!p||j>i-1) //指针应该不等于或1>i,指针不等于0代表没有大于表长。 { printf("位置小于1或大于表长。\n"); return L; } s = (LinkList)malloc(sizeof(LNode)); s->data = newnode; s->next = p->next; //将s的next指向原来p的next,再将p的next指向s p->next = s; return L; } /* 用于删除结点的函数 */ LinkList ListDelete_L(LinkList L, int i) { LinkList p = L; LinkList s; int j=0; while(p->next&&j<i-1) { p = p->next; ++j; } if(!(p->next)||j>i-1) { printf("删除位置不合理。\n"); return L; } s = p->next; p->next = s->next; //p->next=p->next->next printf("%s%d\n","被删除的结点是:",s->data); free(s); return L; } /*用于遍历链表的函数 */ void ListDisp_L(LinkList L) { LinkList p; int i=0; p = L->next; while(p) { printf("%d:%d\n", ++i,p->data); p = p->next; //依次输出将p后移 } } /* 选择排序算法 */ LinkList ListSort_L(LinkList L) { LinkList h1,p,q,r,s; h1=p=(LinkList)malloc(sizeof(LinkList)); p->next=L; while(p->next) { q=p->next; r=p; while(q->next) { if(q->next->data < r->next->data) r=q; q=q->next; } if(r!=p) { s=r->next; r->next=s->next; s->next=p->next; p->next=s; } p=p->next; } L=h1->next; free(h1); return L; } int getoptions() { int opt; printf(" *************************************************** \n"); printf(" *******************by ruoyun******************** \n"); printf(" *************************************************** \n"); printf(" ******** 1: 录入链表 *********** \n"); printf(" ******** 2: 显示链表 *********** \n"); printf(" ******** 3: 插入结点 *********** \n"); printf(" ******** 4: 删除结点 *********** \n"); printf(" ******** 5: 排序链表 *********** \n"); printf(" ******** 6: 退出 *********** \n"); printf(" ******** 输入选项并按回车确认: *********** \n"); printf(" *************************************************** \n"); scanf("%d",&opt); return opt; } int main(int argc, char* argv[]) { int opt; int where; int value; int count; LinkList L; while(1) { system("CLS"); opt = getoptions(); switch(opt) { case 1: { system("CLS"); printf("请输入链表初始结点数:"); scanf("%d",&count); printf("请输入各个结点数值,每输入一个按回车确认:\n"); L = CreateList_L(L, count); system("CLS"); ListDisp_L(L); system("PAUSE"); break; } case 2: { system("CLS"); ListDisp_L(L); system("PAUSE"); break; } case 3: { system("CLS"); ListDisp_L(L); printf("请输入插入位置:"); scanf("%d", &where); printf("请输入要插入的数值:"); scanf("%d", &value); system("CLS"); L = ListInsert_L(L,where,value); ListDisp_L(L); system("PAUSE"); break; } case 4: { system("CLS"); ListDisp_L(L); printf("请输入要删除的位置:"); scanf("%d",&where); system("CLS"); L = ListDelete_L(L,where); ListDisp_L(L); system("PAUSE"); break; } case 5: { system("CLS"); L = ListSort_L(L); ListDisp_L(L); system("PAUSE"); break; } case 6: { return 0; } default : { printf("您输入有误,请从新输入 \n"); system("PAUSE"); } } } }
相关文章推荐
- 链表操作综合练习(创建、拆分、插入、删除、合并、打印、逆置)
- 对链表的综合操作
- 对单向链表的综合操作
- 单链表综合操作
- 关于链表的综合操作
- l链表的综合操作
- 链表的综合操作(重新整理,模块一点)
- P305_1111链表的综合操作,建表、…
- 链表的操作
- 单链表的基本操作大全之C语言实现(一)
- 简单链表的操作
- 链表栈的基本操作
- java单向链表基本操作简单实现
- c++关于链表的操作
- 双向链表操作(逆置三种实现以及 冒泡排序 )
- 链表操作 部分反转链表
- C语言链表各种操作
- 单链表--操作总结
- java实现链表各种操作
- 韩顺平_PHP程序员玩转算法公开课(第一季)03_单链表crud操作之_水浒英雄排行算法_学习笔记_源代码图解_PPT文档整理