用單鏈表實現字符串的插入,插入在前一個字符串最大的字符後

用單鏈表實現字符串的插入,插入在前一個字符串最大的字符後

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#define maxsize 100000
char s1[maxsize+1],s2[maxsize+1];

typedef int Elemtype;//定義數據類型,int類型所佔字節比char大,完全可以以字符形式輸出
typedef struct Lnode//定義結點
{
	Elemtype data;
	struct Lnode *next;
}Lnode,*LinkList;

LinkList CreateListR(char *s)//尾插法建表
{
	LinkList L,r,p;
	L=(LinkList)malloc(sizeof(Lnode));
	if (L==NULL)
	{
		printf("分配結點失敗\n");
		exit(-1);
	}
	L->next=NULL;
	r=L;
	int i;
	for (i=0;i<strlen(s);i++)
	{
		p=(LinkList)malloc(sizeof(Lnode));
		if (p==NULL) 
		{
			printf("新建結點失敗\n");
			exit(-1);
		}
		p->data=s[i];
		r->next=p;
		r=p;
	}
	r->next=NULL;
	return L;
}

void DispList(LinkList L)//輸出單鏈表
{
	LinkList p=L->next;
	if (p==NULL) printf("空表\n");
	while (p!=NULL)
	{
		printf("%c",p->data);
		p=p->next;
	} 
	printf("\n");
}

char Findmax(LinkList L)//尋找第一個單鏈表中最大元素
{
	LinkList p;
	p=L->next;
	char maxp=p->data;
	if (p==NULL) return '\0';//單鏈表爲空
	while (p!=NULL)
	{
		if(p->data>maxp) maxp=p->data;
		p=p->next;
	}
	return maxp;
}

LinkList Merge(LinkList L1,LinkList L2)//合併兩個單鏈表
{
	char max=Findmax(L1);
	LinkList p,q,pre;
	p=L1->next;q=L2->next;
	if (max=='\0') return L2;//若第一個單鏈表爲空,直接返回單鏈表2的頭結點
	while (p->data!=max) p=p->next;
	pre=p->next;
	p->next=q;
	while (q->next!=NULL) q=q->next;
	q->next=pre;
	return L1;
}

int main(int argc, char *argv[]) {
	scanf("%s",s1);
	getchar();
	scanf("%s",s2);
	LinkList L1=CreateListR(s1);
	LinkList L2=CreateListR(s2);
	DispList(Merge(L1,L2));
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章