01---链表---20195106023---王亚威.c

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define false 0
#define true 1
typedef struct Node
{
	int data; //数据域
	struct Node * pNext; //指针域
}NODE, *PNODE;
//创建一个链表
PNODE create_list_1(void)
{
	int len;  //用来存放有效节点的个数
	int i;
	int val; //用来临时存放用户输入的结点的值
	PNODE pHead_1 = (PNODE)malloc(sizeof(NODE));
	if (NULL == pHead_1)
	{
		printf("分配失败, 程序终止!\n");
		exit(-1);
	}
	PNODE pTail = pHead_1;
	pTail->pNext = NULL;

	printf("请输入您需要生成的链表节点的个数:\n len = ");
	scanf("%d", &len);

	for (i=0; i<len; ++i)
	{
		printf("请输入第%d个节点的值: ", i+1);
		scanf("%d", &val);

		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if (NULL == pNew)
		{
			printf("分配失败, 程序终止!\n");
			exit(-1);
		}
		pNew->data = val;
		pTail->pNext = pNew;
		pNew->pNext = NULL;
		pTail = pNew;
	}

	return pHead_1;
}
//遍历链表
void traverse_list(PNODE pHead_1)
{
	printf("遍历所得链表为:\n");
	PNODE p=pHead_1->pNext;
	while(NULL!=p)
	{
		printf("%d  ",p->data);
		p=p->pNext;
	}
	printf("\n");
}
//求链表长度
int length_list(PNODE pHead_1)
{

	int len=0;
	PNODE p=pHead_1;
	while(p->pNext!=NULL)
	{
		len++;
		p=p->pNext;
	}
	printf("现在的链表长度为:%d\n",len);
	return len ;

}
//插入一个结点
void insert_list(PNODE pHead_1)
{
	int pos ;
	int val;
	int i = 0;
    printf("请选择在第几个节点插入\n");
    scanf("%d",&pos);
    printf("请输入所插入节点的值:");
    scanf("%d",&val);
	PNODE p = pHead_1;
	while (NULL!=p && i<pos-1)
	{
		p = p->pNext;
		++i;
	}
	if (i>pos-1 || NULL==p)
		return false;

	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if (NULL == pNew)
	{
		printf("动态分配内存失败!\n");
		exit(-1);
	}
	pNew->data = val;
	PNODE q = p->pNext;
	p->pNext = pNew;
	pNew->pNext = q;

	return true;
}
//删除一个结点
_Bool delete_list(PNODE pHead_1, int pos, int * pVal)
{
	int i = 0;
	PNODE p = pHead_1;
	while (NULL!=p->pNext && i<pos-1)
	{
		p = p->pNext;
		++i;
	}
	if (i>pos-1 || NULL==p->pNext)
    return false;
	PNODE q = p->pNext;
	*pVal = q->data;//删除p节点后面的结点
	p->pNext = p->pNext->pNext;
	free(q);
	q = NULL;
	return true;
}
//根据指定的位序查找
void Find_elem_byloc (PNODE pHead_1)
{
    int cnt = 1;//位序从1开始
    int pos ;
    printf("请输入你要按序号查找的数的序号:\n");
	scanf("%d",&pos );
	PNODE pnode = pHead_1->pNext ;
	while
	(pnode && cnt < pos)
    {
		pnode = pnode -> pNext;
		cnt++;
	}
	if((cnt==pos)&&pnode)
	printf("您查找的数为:%d\n",pnode->data);
	else printf("您查找数不存在\n");
}
//按值查找
void Find_elem_bypri (PNODE pHead_1)
{
    int i ;
    int val=1;
    printf("请输入您要查找的值\n");
    scanf("%d" , &i );
	PNODE pnode  = pHead_1->pNext;
	while(pnode && pnode ->data!=i ){
		pnode = pnode -> pNext;
		val++ ;
	}
	if(pnode)
    printf("查找成功,您查找的数的位序为:%d\n",val );
	else
	printf("您查找数不存在\n");
}
//链表冒泡排序
PNODE ListSort(PNODE pHead_1)
{
    PNODE p,q,tail ,h;
    tail = NULL;
    h = pHead_1;
    while(h->pNext!=tail)
    {
        p =pHead_1;
        q = p->pNext;
        while(q->pNext!=tail)
        {
            if(p->pNext->data > q->pNext->data)
            {
                p->pNext = q->pNext;
                q->pNext = q->pNext->pNext;
                p->pNext->pNext = q;
                p = p->pNext;
            }
            else
            {
                p = p->pNext;
                q = q->pNext;
            }
        }
        tail = q; //前移一位
    }
    return pHead_1;
}
//创建另一个链表
PNODE create_list_sec(void)
{
	int len;  //用来存放有效节点的个数
	int i;
	int val; //用来临时存放用户输入的结点的值

	PNODE pHead_2 = (PNODE)malloc(sizeof(NODE));
	if (NULL == pHead_2)
	{
		printf("分配失败, 程序终止!\n");
		exit(-1);
	}
	PNODE pTail = pHead_2;
	pTail->pNext = NULL;

	printf("请输入您需要生成的链表节点的个数:\n len = ");
	scanf("%d", &len);

	for (i=0; i<len; ++i)
	{
		printf("请输入第%d个节点的值: ", i+1);
		scanf("%d", &val);

		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if (NULL == pNew)
		{
			printf("分配失败, 程序终止!\n");
			exit(-1);
		}
		pNew->data = val;
		pTail->pNext = pNew;
		pNew->pNext = NULL;
		pTail = pNew;
	}
	return pHead_2;
}
//合并两个链表
PNODE Merge_LinkList(PNODE pHead_1, PNODE pHead_2)
{
    PNODE Lc, La, Lb, pa, pb, pc, ptr;
    La = pHead_1;
    Lb = pHead_2;
    Lc = La;  pc=La  ;
    pa=La->pNext ;
    pb=Lb->pNext ;
    while (pa&&pb)
    {
        if(pa->data<pb->data) {
            pc->pNext=pa ;  pc=pa ;   pa=pa->pNext  ;
        }else if(pa->data>pb->data) {
            pc->pNext=pb ;  pc=pb ;   pb=pb->pNext  ;
        }else if  (pa->data==pb->data) {
             pc->pNext=pa ;  pc=pa ;   pa=pa->pNext  ;
             ptr=pb ; pb=pb->pNext ; free(ptr) ;
        }
    }
    if(pa!=NULL)  pc->pNext=pa ;
    else   pc->pNext=pb ;     		/*将剩余的结点链上*/
    free(Lb) ;
    printf("合并后");
    return Lc;
}
void ShowMenu()//显示菜单
{
	int i;
	int WIDESIZE = 65;
	printf("\n\n\n");
	printf("------------------------");
	printf("\t欢迎使用线性表的链式表示和实现\t");
	printf("------------------------\n\n");
	printf("\t\t");
	for(i=0;i<WIDESIZE;i++)
	{
		printf("*");
	}
	printf("\n\n");
	printf("\t\t*\t1.系统帮助及说明\t**");
	printf("\t2.创建一个链表\t\t*\n");
	printf("\t\t*\t3.求链表的长度\t\t");
	printf("**\t4.插入一个结点\t\t*\n");
	printf("\t\t*\t5.删除一个结点\t\t**");
	printf("\t6.按成位序找结点信息\t*\n");
	printf("\t\t*\t7.按值查找结点信息\t**");
	printf("\t8.排序第一个链表\t*\n");
	printf("\t\t*\t9.创造第二个链表\t**");
	printf("\t10.遍历第一个链表\t*\n");
    printf("\t\t*\t11.遍历第二个链表\t**");
    printf("\t12.排序第二个链表\t*\n");
    printf("\t\t*\t13.合并链表并退出\t**");
	printf("\t14.退出该系统\t\t*");
	for(i=0;i<4;i++)
	{
		printf("\t");
	}
	printf("\n\t\t");
	for(i=0;i<WIDESIZE;i++)
	{
		printf("*");
	}
	printf("\n");
	printf("--------------------------------");
	printf("   2019级电科一班王亚威作品   ");
	printf("----------------------------------\n");
	printf("\n\n请按所需输入菜单编号:");
}
void ShowHelp()//显示帮助信息
{
	printf("1、此系统可以简单完成线性表的链式表示和实现\n");
	printf("2、输入对应功能项的编号即可进行不同功能的操作。\n");
}
int main(void)
{
    PNODE pHead_1 = NULL;
    PNODE pHead_2 = NULL ;
    int pos ;
    int val ;
    int len ;
	int flag = -1;
	int choice;
	while(flag!=12)
	{
		ShowMenu();
		scanf("%d",&choice);
		switch (choice)
		{
			case 1:
				ShowHelp();break;
			case 2:
				pHead_1 = create_list_1();
                printf("创造的链表");
                traverse_list(pHead_1);break;
			case 3:
				len=length_list(pHead_1);break;
			case 4:
				insert_list(pHead_1);
                printf("插入后");
                traverse_list(pHead_1);;break;
			case 5:
                printf("请选择在第几个节点删除\n");
                scanf("%d",&pos);
                if(delete_list(pHead_1,pos,&val))
                {
                    printf("删除成功,您所删除的元素是:%d\n",val);
                }
                else
                {
                    printf("删除失败!您所删除的元素不存在!\n");
                }
                printf("删除后");
                traverse_list(pHead_1);break;
			case 6:
                Find_elem_byloc(pHead_1); break;
			case 7:
				Find_elem_bypri(pHead_1);break;
			case 8:
                pHead_1 = ListSort(pHead_1);
                printf("排序后");
                traverse_list(pHead_1);break;
			case 9:
                pHead_2 = create_list_sec();
                printf("创造的另一个链表");
                traverse_list(pHead_2);break;
            case 10:
                traverse_list(pHead_1);break;
            case 11:
                traverse_list(pHead_2);break;
            case 12:
                ListSort(pHead_2);
                traverse_list(pHead_2);break;
            case 13:
                traverse_list(Merge_LinkList(pHead_1,pHead_2));
			case 14:
				flag = 14;break;
		}
	}
	return 0;
}

 

posted @ 2020-11-30 23:00  张同光  阅读(150)  评论(0编辑  收藏  举报