連結串列問題歸納總結--C和C++
阿新 • • 發佈:2019-01-28
1.單鏈表的建立、測長以及列印
struct Node
{
int data;
Node *next;
};
Node *CreatList()
{
int data;
Node *head, *p, *s = NULL;
head = (Node*)malloc(sizeof(Node));
p = head;
int cycle = 1;
cout << "請輸入你需要的連結串列,按“0”鍵結束:" << endl;
while (cycle)
{
scanf("%d ", &data);
if (data)
{
s = (Node*)malloc(sizeof(Node));
s->data = data;
p->next = s;
p = p->next;
}
else
break;
}
head = head->next;
s->next = NULL;
return head;
}
int ListLength(Node *head )
{
int len = 0;
Node *p = head;
while (p != NULL)
{
p = p->next;
len++;
}
return len;
}
void ListPrint(Node *head)
{
if (head)
{
Node *p = head;
cout << "連結串列長度為: " << ListLength(head) << endl;
cout << "連結串列為: " ;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
}
2.單鏈表刪除結點
Node *DeleteNode(Node *head, int x)
{
if (head == NULL)
return NULL;
Node *p1 = head, *p2 = NULL;
while (p1->data != x && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (p1->data == x)
{
if (p1 == head)
{
head = p1->next;
free(p1);
}
else
{
p2->next = p1->next;
free(p1);
}
}
return head;
}
3.單鏈表插入節點
Node *ListInsert(Node *head, int x)
{
Node *p1 = head, *p2 = NULL;
Node *s = (Node*)malloc(sizeof(Node));
s->data = x;
while (p1->data < x && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (p1->data >= x)
{
if (p1 == head)
{
s->next = p1;
head = s;
}
else
{
p2->next = s;
s->next = p1;
}
}
else
{
p1->next = s;
s->next = NULL;
}
return head;
}
4.實現單鏈表的排序
Node *ListSort(Node *head)
{
Node *p = head;
int len = ListLength(head);
int tmp, flag = 0;
for (int i = 1; i < len; i++)
{
p = head;
for (int j = i; j < len; j++)
{
if (p->data>p->next->data)
{
tmp = p->data;
p->data = p->next->data;
p->next->data = tmp;
flag = 1;
}
p = p->next;
}
if (!flag) //若未發生交換,排序結束
break;
}
return head;
}
5.給出一個單鏈表,不知道結點N的值,怎樣只遍歷一次就可以求出他的中間節點
Node *SearchMidNode(Node *head)
{
Node *p1 = head, *p2 = head;
while (p1->next != NULL)
{
p1 = p1->next;
if (p1->next == NULL)
break;
else
{
p1 = p1->next;
p2 = p2->next;
}
}
return p2;
}
程式碼解析:即建立兩個指標p1、p2指向連結串列的首位置,p1每次向前遞加兩次,p2遞加一次,直到p1指向連結串列尾端,返還p2