資料結構之單鏈表操作
阿新 • • 發佈:2021-03-08
資料結構,單鏈表操作,本來應該三年前就應該會的,奈何上學的時候呼呼睡大覺,最近看程式碼又接觸到了,花了幾天時間自己重新寫了一下
連結串列操作應該是基礎的,並且需要會的,雖然只是簡單地初始化,增加連結串列節點等簡單操作,但是考查了很重要的知識點,指標,結構體,形參實參,還有簡單的演算法
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct List{
struct List *next;
int data;
}mylist;
void init_mylist (mylist **list);//初始化連結串列
void add_mylist(mylist *list);//增加節點
void arry_mylist(mylist *list);//非遞減排序
void merge_mylist(mylist *list1,mylist *list2,mylist *list3);//連結串列合併
void printf_mylist(mylist *list);//列印連結串列
//主函式
int main(int argc, char *argv[])
{
mylist *l1,*l2,*l3;
srand(time(NULL));
init_mylist (&l1);
init_mylist(&l2);
init_mylist(&l3);
//printf("%d\n",l1->data);
for(int i=0;i<5;i++)
{
add_mylist(l1);
add_mylist(l2);
}
printf_mylist(l1);
printf_mylist(l2);
arry_mylist (l1);
arry_mylist(l2);
printf_mylist(l1);
printf_mylist(l2);
merge_mylist(l1,l2,l3);
printf_mylist(l3);
return 0;
}
void init_mylist(mylist **list)
{
mylist *l;
l = malloc(sizeof(mylist));//頭結點
l->data = 1;//頭結點資料區,儲存資料節點數
l->next = NULL;
*list = l;
}
void add_mylist(mylist *list)
{
mylist *l = list;
mylist *li;
li = malloc(sizeof(mylist));
li->data = rand()%30;//隨機數
li->next = NULL;
while(l->next)
{
l = l->next;
}
l->next = li;
list->data = list->data +1;//節點數加一
}
void printf_mylist(mylist *list)
{
mylist *l = list;
while(l)
{
printf("%d\t",l->data);//列印在一行,水平製表符間隔
l = l->next;
}
printf("\n");//換行
}
void arry_mylist(mylist *list)
{
mylist *l = list->next;
mylist *l1;
int a;
while(l->next)
{
l1 = l->next;
while(l1)
{
if(l->data >= l1->data)//這個我只是用簡單地用元素交換方法
{
a = l->data;
l->data = l1->data;
l1->data = a;
}
l1 = l1->next;
}
l = l->next;
}
}
void merge_mylist(mylist *list1,mylist *list2,mylist *list3)
{
mylist *l1 = list1->next;
mylist *l2 = list2->next;
mylist *l3 = list3;
while(l1 && l2)
{
if(l1->data < l2->data)
{
l3->next = l1;
l1 = l1->next;
}else{
l3->next = l2;
l2 = l2->next;
}
l3 = l3->next;
}
if(l1)
{
l3->next = l1;
}else{
l3->next = l2;
}
list3->data = list1->data + list2->data - 1;//計算總節點數
}
編譯和執行結果
我這也算是在補課吧