花了半天終于把鏈表弄清楚了,一個字——爽!
新建鏈表
#include <stdio.h>
#include <stdlib.h>
//這里創(chuàng)建一個結(jié)構(gòu)體用來表示鏈表的結(jié)點類型
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head, *p, *q, *t;
int i, n, a;
scanf("%d", &n);
head = NULL;//頭指針初始為空
for (i = 1; i <= n; i++)//循環(huán)讀入n個數(shù)
{
scanf("%d", &a);
//動態(tài)申請一個空間摔踱,用來存放一個結(jié)點,并用臨時指針p指向這個結(jié)點
p = (struct node *)malloc(sizeof(struct node));
p->data = a;//將數(shù)據(jù)存儲到當前結(jié)點的data域中
p->next = NULL;//設(shè)置當前結(jié)點的后繼指針指向空考婴,也就是當前結(jié)點的下一個結(jié)點為空
if (head == NULL)
head = p;//如果這是第一個創(chuàng)建的結(jié)點,則將頭指針指向這個結(jié)點
else
q->next = p;//如果不是第一個創(chuàng)建的結(jié)點赤嚼,則將上一個結(jié)點的后繼指針指向當前結(jié)點
q = p;//指針q也指向當前結(jié)點
}
//輸出鏈表中的所有數(shù)
t = head;
while (t != NULL)
{
printf("%d ", t->data);
t = t->next;//繼續(xù)下一個結(jié)點
}
getchar(); getchar();
return 0;
}
完整代碼(增刪)
#include <stdio.h>
#include <iostream>
using namespace std;
struct student
{
int num;
float score;
struct student *next;
};
int n = 0; //全局變量,用于記錄鏈表結(jié)點數(shù)
int main()
{
student *create();
student *insert(student *head, student *stu);
student *del(student *head, int num);
void print(student *head); //函數(shù)提前聲明
student *head, stu; //*head為新建的鏈表顺又,stu為新增的數(shù)據(jù)
int del_num;
head = create(); //新建鏈表
print(head);
cout << "Input the deleted number : \n";
cin >> del_num;
head = del(head, del_num); //刪除數(shù)據(jù)
print(head);
cout << "Input the inserted record : \n";
cin >> stu.num >> stu.score;
head = insert(head, &stu); //添加數(shù)據(jù)
print(head); //打印數(shù)據(jù)
return 0;
}
student *create() {
student *head, *p1, *p2;
head = NULL; //頭指針初始為空
p1 = p2 = new student; //用new在內(nèi)存中開辟一個結(jié)構(gòu)體變量的空間更卒,將地址賦給p1,p2
cin >> p1->num >> p1->score; //將數(shù)據(jù)賦給剛開辟的變量空間
while (p1->num != 0) {
n = n + 1;
if (head == NULL)
head = p1; //如果這是第一個創(chuàng)建的結(jié)點,則將頭指針指向這個結(jié)點
else {
p2->next = p1; //如果不是第一個創(chuàng)建的結(jié)點稚照,則將上一個結(jié)點的后繼指針指向當前結(jié)點
p2 = p1; //指針p2也指向當前結(jié)點蹂空,因為等會兒p1又要指向新創(chuàng)建的數(shù)據(jù)
p1 = new student;
cin >> p1->num >> p1->score;
}
}
p2->next = NULL;
return (head);
}
void print(student *head) {
student *p;
p = head;
while (p != NULL)
{
cout << p->num << '\t' << p->score << '\n';
p = p->next;
}
}
student *insert(student *head,student *stu) {
student *p0, *p1, *p2;
p1 = head; p0 = stu; //p0指向要插入的結(jié)點
if (head == NULL) {
head = p0;
p0->next = NULL; //鏈表為空
}
else {
while ((p0->num > p1->num) && (p1->next != NULL)) { //未找到結(jié)點,循環(huán)
p2 = p1;
p1 = p1->next;
}
if (p0->num <= p1->num) { //找到結(jié)點
if (head == p1)
head = p0; //插入在第一個結(jié)點前
else
p2->next = p0;
p0->next = p1;
}
else {
p1->next = p0;
p0->next = NULL; //插入在最后一個后
}
}
n = n + 1;
return (head);
}
student *del(student *head,int num) {
struct student *p1, *p2;
if (head == NULL) {
cout << "list null\n";
return NULL; //鏈表為空
}
p1 = head;
while (num != p1->num && p1->next != NULL) { //判斷p1所指向的結(jié)點是否是要刪除的結(jié)點
p2 = p1; p1 = p1->next; //未找到結(jié)點果录,循環(huán)上枕。繼續(xù)判斷下一個結(jié)點是否是要刪除的結(jié)點
}
if (num == p1->num) { //p1當前指向的結(jié)點就是要刪除的結(jié)點
if (num == head->num)
head = p1->next; //結(jié)點為第一個
else
p2->next = p1->next; //找到結(jié)點。將p2的指針成員指向p1所指的下一個結(jié)點
n = n - 1;
}
else cout << "Not found\n"; //循環(huán)結(jié)束弱恒,沒有要找的結(jié)點
return head;
}