1. 程式人生 > >連結串列八大操作

連結串列八大操作

連結串列八大操作 2018年12月22日
*以下內容僅供娛樂,歡迎隨時探討,請多指教!
有如下的結構體:

typedef struct link_list
{
	int num;
	char sex[20];
	char name[30];
	struct link_list *next;
}STU;

利用此結構體設計單鏈表,並在單鏈表上完成如下操作:
(1) 建立連結串列。
(2) 輸出連結串列。
(3) 連結串列查詢。
(4) 連結串列插入。
(5) 連結串列刪除。
(6) 連結串列逆序。
(7) 連結串列合併。
(8) 連結串列拆分。

#include "stdio.h"
#include "stdlib.h" #include "string.h" #define N sizeof(struct link_list) //結構體型別 typedef struct link_list { int num; char sex[20]; char name[30]; struct link_list *next; } STU; void chaifen(STU *list);//按男女拆分連結串列函式 STU *merge(STU *list1,STU *list2);//合併連結串列函式 STU *reverse(STU*head);//反轉連結串列函式 STU *
del(STU*head,int num);//插入連結串列函式 STU *insertbynum(STU*head,int num);//插入連結串列函式 STU *search(STU *head ,int num);//查詢連結串列函式 void output(STU *head);//輸出連結串列函式 STU *creat();//建立連結串列函式 STU *man=NULL,*woman=NULL; int main () { int ch; int flag1=0,flag2=0; STU *p,*q=NULL,*t; int m,j; back: printf("1.建立連結串列\n");
printf("2.輸出連結串列\n"); printf("3.查詢連結串列\n"); printf("4.插入連結串列\n"); printf("5.刪除連結串列\n"); printf("6.倒序連結串列\n"); printf("7.合併連結串列\n"); printf("8.拆分連結串列\n"); printf("9.輸出拆分連結串列\n"); printf("10.輸出查詢人的資訊\n"); printf("你的選擇是 :"); scanf("%d",&m); switch (m) { case 1 : p=creat(); flag1=1; break; case 2 : if(!flag1) { system("cls"); printf("請先建立連結串列\n"); goto back; } system("cls");//實現清屏操作 printf("輸出結果為\n"); output(p); break; case 3 : if(!flag1) { system("cls"); printf("請先建立連結串列\n"); goto back; } system("cls"); printf("輸入要查詢的學號\n"); scanf("%d",&j); t=search(p,j); flag2=1; break; case 4 : if(!flag1) { system("cls"); printf("請先建立連結串列\n"); goto back; } system("cls"); printf("請輸入要插入的學號\n"); scanf("%d",&j); p=insertbynum(p,j); break; case 5 : if(!flag1) { system("cls"); printf("請先建立連結串列\n"); goto back; } system("cls"); printf("請輸入要刪除的學號\n"); scanf("%d",&j); p=del(p,j); break; case 6 : if(!flag1) { system("cls"); printf("請先建立連結串列\n"); goto back; } system("cls"); p=reverse(p); break; case 7 : if(!flag1) { system("cls"); printf("請先建立連結串列\n"); goto back; } system("cls"); printf("建立第二個連結串列\n"); q=creat(); p=merge(p,q); break; case 8 : if(!flag1) { system("cls"); printf("請先建立連結串列\n"); goto back; } system("cls"); chaifen(p); break; case 9: if(!flag1) { system("cls"); printf("請先建立連結串列\n"); goto back; } system("cls"); printf("man is \n"); output(man); printf("woman is\n"); output(woman); break; case 10 : system("cls"); if(!flag1||!flag2) { system("cls"); printf("請先建立連結串列或查詢內容\n"); goto back; } printf("查詢內容為 :\n"); printf("%d %s %s\n",t->num,t->sex,t->name); break; default : system("cls"); printf("請先建立連結串列或選擇正確的數字\n"); goto back; } printf("已完成操作,輸入1繼續執行否則結束\n"); scanf("%d",&ch); if (ch == 1) { system("cls"); goto back; } return 0; } //建立連結串列函式 STU *creat() { STU *p,*q,*head=NULL; int num; system("cls"); printf("請輸入學號,以小於0結尾\n"); scanf("%d",&num); if (num<=0) { return head; } while (num>0) { p=(STU*)malloc(N); p->num=num; printf("請輸入性別和姓名(以空格或tab或回車結束)\n"); scanf("%s%s",p->sex,p->name); if(head==NULL) { head=p; } else { q->next=p; } q=p; system("cls"); printf("請輸入學號,以小於0結尾\n"); scanf("%d",&num); } system("cls"); q->next=NULL; return head; } //輸出連結串列函式 void output(STU *head) { while (head) { printf("%d %s %s\n",head->num,head->sex,head->name); head=head->next; } } //查詢連結串列函式 STU *search(STU *head ,int num) { if(!head) { return head; } while (head&&head->num!=num) { head=head->next; } // printf("%d%s%s\n",head->num,head->sex,head->name); return head; } //插入連結串列函式 STU *insertbynum(STU*head,int num) { STU *p,*q,*s; s=(STU*)malloc(N); s->num=num; printf("請輸入性別和姓名(以空格或tab或回車結束)\n"); scanf("%s%s",s->sex,s->name); if(!head) { head=s; s->next=NULL; return head; } if(head->num>num) { s->next=head; head=s; return head; } q=head,p=head->next; while (p&&p->num<num) { q=p; p=p->next; } s->next=q->next; q->next=s; return head; } //刪除連結串列函式 STU *del(STU*head,int num) { STU *p,*q; if(!head) { return head; } if(head->num==num) { p=head; head=head->next; free(p); return head; } q=head,p=head->next; while (p&&p->num!=num) { q=p; p=p->next; } if(p->num==num) { q->next=p->next; free(p); } return head; } //反轉連結串列函式 STU *reverse(STU*head) { STU *p,*q; if (!head) { return head; } q=p=head->next; head->next=NULL; while (p) { p=p->next; q->next=head; head=q; q=p; } return head; } //合併連結串列函式 STU *merge(STU *list1,STU *list2) { STU *head_all=NULL,*p,*q,*s=NULL; head_all=s; p=list1; q=list2; if (!list1) { return list2; } if(!list2) { return list1; } while (list1 && list2) { if(list1->num <list2->num) { p=p->next; if (!s) { head_all=s=list1; } else { s->next=list1; s=s->next; } list1=p; } else { q=q->next; if (!s) { head_all=s=list2; } else { s->next=list2; s=s->next; } list2=q; } } if (!list1) { s->next=list2; } else { s->next=list1; } return head_all; } //按男女拆分連結串列函式 void chaifen(STU *list) { STU *p,*m=NULL,*w=NULL; p=list; while (list) { p=p->next; if (!strcmp(list->sex,"man")) { if (!man) { man=m=list; } else { m->next=list; m=m->next; } } else if (!strcmp(list->sex,"woman")) { if (!woman) { woman=w=list; } else { w->next=list; w=w->next; } } else { ; } list=p; } if (m) { m->next=NULL; } if(w) { w->next=NULL; } }