线性表

xiaoxiao2022-06-11  35

/* *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; } }
转载请注明原文地址: https://www.6miu.com/read-4931753.html

最新回复(0)