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

周末,无聊,上个更无聊的程序。

自己写的,水平不咋滴,凑合着看吧吐舌头

/*
**题目:单链表的相关操作
**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;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值