/*
*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;
}
}