周末,无聊,上个更无聊的程序。
自己写的,水平不咋滴,凑合着看吧
/*
**题目:单链表的相关操作
**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;
}