但行好事,莫问前程

线性表

/*
 *author:zylg project:link list
 * fuction introduce
 * createLinklistF() createLinklistB()
 * displayLinklist(linklist* head)
 * get(linklist* head,int n)
 * locate(listlist* head,char ch)
 * insertLinklist(linklist* head,char ch,int x)
 * deleteLinklist(linklist* head,int n)
 * reverseLinklist(linklist* head)
 * deleteSameLinklist(linklist* head)
 *注意:1.线性表的最后一个节点的next因为不存在,所以必须赋值NULL
 *
*/
#include<stdlib.h>
#include <iostream>
#include<string>
#include<iomanip>
using namespace std;
typedef struct node
{
    char ch;
    struct node * next;
}linklist;
linklist *link;
void displayLinklist(linklist *head)
{
    while(head!=NULL)
    {
        cout<<head->ch;
        head=head->next;
    }
}
linklist *createLinklistF()
{

    linklist *head,*s;
    char ch;
    head=NULL;//这东西必须加上
    ch=cin.get();
    while(ch!='\n')
    {

        s=(linklist*)malloc(sizeof(linklist));
        s->ch=ch;
        s->next=head;
        head=s;
        ch=cin.get();
    }

    return head;
}
linklist* createLinklistB()
{
    linklist *head,*s,*r;
    char ch;
    head=NULL;
    r=NULL;
    ch=cin.get();
    while(ch!='\n')
    {
        s=(linklist*)malloc(sizeof(linklist));
        s->ch=ch;
        if(head==NULL)head=s;
        else r->next=s;
        r=s;
        ch=cin.get();
    }
    if(r!=NULL)r->next=NULL;//这个也必须加上
    return head;
}
linklist *get(linklist *head,int n)
{
    int i=1;
    while(head!=NULL)
    {
        if(i==n)return head;
        else
        {
            ++i;
            head=head->next;
        }
    }
    return NULL;
}
linklist *locate(linklist *head,char ch)
{
    while(head!=NULL)
    {
        if(head->ch==ch)return head;
        else
        {
            head=head->next;
        }
    }
    return NULL;
}
linklist* insertLinklist(linklist *head,char ch,int n)
{
    //s的建立主要是保留head地址不变,好返回。temp用于插入,i算是计数器。
    //插入的方法:启用计数器找到插入位置的前一个node,之后进行插入
    linklist *s=head,*temp;
    temp=(linklist*)malloc(sizeof(linklist));
    temp->ch=ch;
    int i=1;
    while(s!=NULL)
    {
        if(i+1==n){temp->next=s->next;s->next=temp;return head;}
        s=s->next;
        ++i;
    }
    return NULL;
}
linklist *deleteLinklist(linklist *head,int n)
{
     //删除的方法:启用计数器找到插入位置的前一个node,之后进行删除
    linklist *s=head;
    int i=1;
    while(s!=NULL)
    {
        if(i+1==n){linklist *temp=s->next;s->next=s->next->next;free(temp);return head;}
        ++i;
        s=s->next;
    }
    return NULL;
}
linklist* reverseLinklist(linklist* L)
{
    //取值,采用前插法丢进去就行,为了节约内存,必须free,所以出现了temp
    linklist *head,*s,*temp;
    head=NULL;
    char ch;
    ch=L->ch;
    while(L!=NULL)
    {
        s=(linklist *)malloc(sizeof(linklist));
        s->ch=ch;
        s->next=head;
        head=s;
        //节约内存
        temp=L;
        L=L->next;
        free(temp);
        if(L==NULL)break;
        ch=L->ch;
    }
    return head;
}
linklist* deleteSameLinklist(linklist *L)
{
    //删除相同,就和排序的原理一样,排序是比较大小,删除相同是找相同的
    linklist *s1,*prior;//因为L记录着初始位置,后面要进行return,所以s1出现了,代替他位置改变.由于要记录相同位置的前一个node,所以prior出现
    s1=L;
    for(;s1!=NULL;s1=s1->next)//由于动态删除的,所以s1->next!=NULL不可以替代s1!=NULL,地址会发生混乱
    {
        prior=s1;
        for(linklist* s2=s1->next;s2!=NULL;)
        {
            if(s1->ch==s2->ch)
            {
                linklist *temp=s2;
                prior->next=s2->next;
                s2=s2->next;
                free(temp);
            }
            else
            {
                prior=s2;
                s2=s2->next;
            }
        }
    }
    return L;
}
void systemMenu()
{
    linklist *link1;
    int i;
    cout<<setiosflags(ios::right)<<setw(40)<<"Link List Menu\n";
    cout<<"                                                 \n\
         (1) createLinklistF()                              \n\
         (2) createLinklistB()                              \n\
         (3) get(int n)                                     \n\
         (4) locate(char ch)                                \n\
         (5) insertLinklist(char ch,int x)                  \n\
         (6) deleteLinklist(linklist* head,int n)           \n\
         (7) reverseLinklist(linklist* head)                \n\
         (8) deleteSameLinklist(linklist* head)             \n\
         (9) exit                                           \n" ;

    cout<<"please choose one answer:\t";
    cin>>i;
    cin.get();//如果连续输入只能靠空格来隔断,如果不,那就需要cin.get()来捕获换行
    if(i==1){

        link1=createLinklistF();
        displayLinklist(link1);
    }
    else if(i==2)
    {
        link1=createLinklistB();
        displayLinklist(link1);
    }
    else if(i==3)
    {
        int n;
        cin>>n;
        link1=get(link,n);
        displayLinklist(link1);
    }
    else if(i==4)
    {
        char ch;
        cin>>ch;
        link1=locate(link,ch);
        displayLinklist(link1);
    }
    else if(i==5)
    {
        char ch;
        int n;

        cin>>ch;
        cin>>n;
        link1=insertLinklist(link,ch,n);
        displayLinklist(link1);
    }
    else if(i==6)
    {
        int n;
        cin>>n;
        link1=deleteLinklist(link,n);
        displayLinklist(link1);
    }
    else if(i==8)
    {
        link1=deleteSameLinklist(link);
        displayLinklist(link1);
    }
    else if(i==7)
    {
        link1=reverseLinklist(link);
        displayLinklist(link1);
    }
    else
    {
        exit(0);
    }
systemMenu();

}
int main()
{
    cout<<"请输入字符串\n";
    link=createLinklistB();
    systemMenu();
    return 0;
}


#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
	char ch;
	struct node * next;
}linklist;
//=================create linklist=============================
linklist *CREATELISTF()//头插法
{
	char ch;
	linklist *head, *s;
	head = NULL;
	ch = getchar();
	while (ch != '\n')
	{
		s = malloc(sizeof(linklist));
		s->ch = ch;
		s->next = head;
		head = s;
		ch = getchar();
	}
	return head;
}
linklist * CREATELISTE()//尾插法
{
	char ch;
	linklist *head, *s, *r;
	head = NULL;
	r = NULL;
	ch = getchar();
	while (ch != '\n')
	{
		s = malloc(sizeof(linklist));
		s->ch = ch;
		if (head == NULL)head = s;
		else r->next = s;
		r = s;
		ch = getchar();
	}
	if (r != NULL) r->next = NULL;
	return head;
}
linklist *CREATELISTE1()
{
	char ch;
	linklist *head, *s, *r;
	head = malloc(sizeof(linklist));
	r = head;
	ch = getchar();
	while (ch != '\n')
	{
		s = malloc(sizeof(linklist));
		s->ch = ch;
		r->next = s;
		r = s;
		ch = getchar();
	}
	r->next = NULL;
	return head;
}
//====================acquier location=========================
linklist *GET(linklist *head,int n)
{
	int i=1;
	while (head->next!=NULL&&i<n)
	{
		head->next = head->next->next;
		i++;
	}
	if (i == n) { return head->next; }
	else { return NULL; }
}
linklist* LOCATE(linklist * head, char ch)
{
	linklist *p;
	p = head->next;
	while (p != NULL)
	{
		if (p->ch != ch) { p = p->next; }
		else { break; }
	}
	return p;
}
//=====================linklist insert=========================
linklist* INSERT(linklist* head, char ch, int x)
{
	linklist *s, *q;
	int i = 0;
	s = malloc(sizeof(linklist));
	s->ch = ch;
	q = head->next;
	while (q != NULL)
	{
		i++;
		if (x == 1)
		{
			s->next = head->next;
			head->next = s;
			return head;
		}
		if (i == (x - 1))
		{
			s->next = q->next;
			q->next = s;
			break;
		}
		else
		{
			q = q->next;
		}
	}
	return head;
}
//=====================DELETE linklist=========================
linklist *DELETE(linklist* L, int x)
{
	linklist *s,*q;
	int i = 1;
	s = L->next;
	while (s != NULL&&i<=x)
	{
		if (x == 1) { L->next = s->next;free(s);break; }
		else if (i == x -1 ) { q =s->next;s->next = s->next->next;free(q);break; }
		s = s->next;
		i++;
	}
	return L;
}
//================DIVERSE linklist=============================
linklist * DIVERSE(linklist *L)
{
	linklist *s, *q,*head,*p;
	s = L->next;
	head = NULL;
	while (s!=NULL)
	{
		q= malloc(sizeof(linklist));
		q->ch = s->ch;
		q->next = head;
		head = q;
		p = s;
		s = s->next;
		free(p);
	}
	L->next = head;
	return L;
}
//==================display====================================
void PRINT(linklist *head)
{
	linklist *s;s = head->next;
	printf("linklist is:\n");
	while (s != NULL)
	{
		printf("%c", s->ch);
		s = s->next;
	}
	putchar(10);
}
//==================delete same================================
linklist* DELSAME(linklist *L)
{
	linklist *s1,*s2,*p1,*p2;
	s1 = L->next;
	for (;s1!= NULL;s1 = s1->next)
	{
		p2 = s1;
		for (s2=s1->next;s2 != NULL;)
		{
			if (s1->ch==s2->ch) 
			{
				p1 = s2;p2->next = s2->next;s2 = s2->next;free(p1);
			}
			else
			{
				p2 = s2;
				s2 = s2->next;
			}
		}
	}
	return L;
}

void main()
{
	
	linklist *head;
	int x,i,q;
	char ch;
	system("color 0A");
	printf("please input linked:\n");
	head = CREATELISTE1();
	while(1)
	{
		
		
		system("pause");
		system("cls");
		printf("\t1.display linked\n");
		printf("\t2.insert element in linked\n");
		printf("\t3.delete element in linked\n");
		printf("\t4.diverse linked\n");
		printf("\t5.delete same element in linked\n");
		printf("\t0.exit\n");
		printf("please choose the number of 0-5:\n");
		scanf("%d",&i);
		switch(i)
		{
		case 1:{PRINT(head);getchar();break;}
		case 2:{printf("please input element and location:\n");getchar();ch=getchar();scanf("%d",&x);head =INSERT(head,ch,x);break;}
		case 3:{printf("please input location:\n");scanf("%d",&q);head = DELETE(head, q);break;}
		case 4:{head = DIVERSE(head);break;}
		case 5:{head = DELSAME(head);break;}
		case 0:{break;};
		default:{printf("input error!!!");break;}
		}
		if(i==0)break;
		
		
	}
}
posted @ 2018-10-15 14:27  专业路过  阅读(113)  评论(0编辑  收藏  举报