連結串列八大操作
阿新 • • 發佈:2019-01-01
連結串列八大操作 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;
}
}