单链表的创建,插入,删除以及就地逆转
2012-08-19 16:02
513 查看
周末,无聊,上个更无聊的程序。
自己写的,水平不咋滴,凑合着看吧
自己写的,水平不咋滴,凑合着看吧
/* **题目:单链表的相关操作 **1.头插法创建单链表; **2.尾插法创建单链表; **3.添加单链表结点;(头插,尾插结点的核心部分和创建链表一样,所以,这里假定链表的元素从小到大有序,将新结点插入链表) **4.删除单链表结点; **5.单链表的就地逆转; **6.退出程序; */ #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; }Node,*linkList; //头结点的初始化 linkList initList(linkList L) { L=(Node *)malloc(sizeof(Node)); if(NULL == L) return 0; else { L->data = 0; L->next = NULL; } return L; } void headBuild(linkList L) { int ch; bool flag = true; printf("\n请输入链表结点,以'#'结束\n"); while(flag) { fflush(stdin); if((ch=getchar())!='#') { Node *p=(Node *)malloc(sizeof(Node)); p->data = ch; //printf("用户输入的结点data = %c\n",ch); p->next = L->next; L->next= p; } else { flag = false; } } } void tailBuild(linkList L) { int ch; bool flag = true; Node *q; q=L; L->next = NULL; //这里将L->next置为空 printf("\n请输入链表结点,以'#'结束\n"); while(flag) { fflush(stdin); if((ch=getchar())!='#') { Node *p = (Node *)malloc(sizeof(Node)); p->data = ch; p->next = q->next; q->next=p; q = p; } else { flag = false; } } } void addNode(linkList L) { int ch; Node *q,*t; printf("\n请输入要添加的结点:"); fflush(stdin); ch = getchar(); Node *p=(Node *)malloc(sizeof(Node)); if(NULL == p) { printf("\n结点添加失败!!!"); return; } else { p->data = ch; } q = L->next; t = L; while((p->data>q->data)&&(NULL!=q->next)) //寻找合适插入结点的位置 { t = q; q = q->next; } if(NULL==q->next) //这里写的很怪异,可以简写的,但简写后有问题,NG的我mark掉了,后面再看问题出在哪里了。。。 { q->next = p; p->next = NULL; } else { p->next = q; t->next = p; } /* //NG method while((p->data>q->data)&&(NULL!=q)) { t = q; q = q->next; } p->next = q; t->next = p; */ } void deleteNode(linkList L) { int ch; Node *q; Node *p = (Node *)malloc(sizeof(Node)); p = L->next; q = L; printf("\n请输入要删除的元素结点:"); fflush(stdin); ch = getchar(); while((p->data!=ch)&&(NULL!=p)) { q = p; p = p->next; } if(p==NULL) printf("链表中无此结点,删除失败!"); else { q->next = p->next; free(p); } } //获取链表长度 int getListLen(linkList L) { int len = 0; Node *p; p=L->next; while(p!=NULL) { len++; p=p->next; //printf("\nlen = %d",len); } return len; } //链表的逆置 void reverse(linkList L) { Node *p,*q,*r; int len; len = getListLen(L); if(len==1) { printf("\n链表仅有一个结点,无需逆转!"); return; } p = L->next; //q = p; L->next = NULL; while(NULL!=p) { q = p; p=p->next; q->next = L->next; L->next = q; } } //打印链表 void printfList(linkList L) { Node *p; p=L->next; int len = getListLen(L); if(len==0) { printf("链表未创建,无需逆转!"); return; } printf("\n链表打印:Head"); while(p!=NULL) { printf("-->%c",p->data); p=p->next; } } void showMenu() { printf("\n\n\n******Welcome!!!******"); printf("\n1.头插法创建单链表;"); printf("\n2.尾插法创建单链表;"); printf("\n3.添加单链表结点;"); printf("\n4.删除单链表结点;"); printf("\n5.单链表的就地逆转;"); printf("\n6.退出程序;"); printf("\n请输入您的选择:"); } int main() { int choose = 0; linkList L;//L为链表头节点 //L = initList(L); //int len = 0; showMenu(); while(choose!='6') { //printf("\nchoose=%d",choose); fflush(stdin); choose = getchar(); switch(choose) { case '1': printf("\nHeadBuild"); L = initList(L); headBuild(L); printfList(L); break; case '2': printf("\nTailBuild"); L = initList(L); tailBuild(L); printfList(L); break; case '3': printf("\nAddNode"); addNode(L); printfList(L); break; case '4': printf("\nDeleteNode"); printfList(L); deleteNode(L); printfList(L); break; case '5': printfList(L); reverse(L); printf("\nReverse"); printfList(L); break; } showMenu(); } return 0; }
相关文章推荐
- 单链表的常用操作,包括单链表的创建、插入、删除、排序、逆置以及打印输出等
- 单链表的创建、插入、删除、销毁以及查找中间结点
- C++单链表的创建插入删除以及逆序操作
- 单链表的插入删除以及逆转
- 单链表的创建、遍历、插入、删除、查找、逆转
- 单链表的创建,插入,删除以及逆序
- 数据结构——单链表的创建、删除、遍历以及节点的插入、删除等操作
- 单链表的插入删除以及逆转
- 单链表的创建,删除,插入以及打印。
- 单链表的创建、插入、删除、排序以及逆置
- 单链表的创建+ 求表长+ 查找+插入+删除
- C++单链表的操作(创建,删除,打印,遍历,插入)
- Oracle数据库的概念(权限、角色)以及各种操作(创建表空间、创建表、查询、更新、删除、插入)和常用函数
- C++单链表的动态创建,查找,遍历,删除,插入,添加,排序
- 数据库复习总结(7)-表的创建以及插入命令、数据修改、数据删除
- 关于单链表的各种函数的C++源代码,创建单链表、求表长、插入、删除等等
- 单链表的创建、初始化、插入、删除 、输出、求表长、清空、查找操作
- 单链表,双向链表的插入,查询,创建,删除,输出
- C语言之数据结构的顺序单链表创建,插入和删除操作
- 单链表的创建,删除,插入,清空全部用一级指针也没发现什么问题啊