您的位置:首页 > 其它

单链表的创建,插入,删除以及就地逆转

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐