单链表的操作(*C语言描述*)
线性表的链式存储结构是用一组任意的存储单元保存线性表的数据元素。
为了操作方便,我们在创建链表时,常采用有头结点的链表。
头结点:
- ### 头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等)。
- ### 有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。
- ### 首元结点也就是第一个元素的结点,它是头结点后边的第一个结点。
- ### 头结点不是链表所必需的。
以学生信息管理为例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student_Information{
int num;
char name[5];
double marks;
}Stu_In;
typedef struct Student {
Stu_In s;
int size;
struct Student *next;
}Stu;
Stu_In input()
{
Stu_In s;
printf("input information\n");
scanf("%d %s %lf", &s.num, s.name, &s.marks);
return s;
}
Stu *Create_End()
{
int b;
Stu *head, *temp, *p;
head = (Stu*)malloc(sizeof(Stu));
head->size = 0;
p = head;
while(1)
{
b = 1;
printf("1 or 0\n");
scanf("%d", &b);
if(b == 0)
break;
temp = (Stu*)malloc(sizeof(Stu));
temp->s = input();
p->next = temp;
p = temp;
head->size++;
}
p->next = NULL;
return head;
}
Stu *Create_Front()
{
int b;
Stu *head, *p;
head = (Stu*)malloc(sizeof(Stu));
head->size = 0;
while(1)
{
b = 1;
printf("1 or 0\n");
scanf("%d", &b);
if(b == 0)
break;
p = (Stu*)malloc(sizeof(Stu));
p->s = input();
p->next = head->next;
head->next = p;
head->size++;
}
return head;
}
Stu* Insert(Stu* L)
{
int Lc;
printf("please input number\n");
scanf("%d", &Lc);
Stu *p, *temp;
p = L;
temp = (Stu*)malloc(sizeof(Stu));
printf("please input insert data\n");
temp->s = input();
while(Lc > 0){
p = p->next;
Lc--;
}
temp->next = p->next;
p->next = temp;
L->size++;
return L;
}
Stu* Delete(Stu* L)
{
int Lc;
Stu *p, *p1;
printf("please input number\n");
scanf("%d", &Lc);
p = L;
while(Lc > 0){
p1 = p;
p = p->next;
Lc--;
}
p1->next = p->next;
L->size--;
free(p);
return L;
}
Stu* Sort(Stu *L)
{
Stu *p, *p1, *temp;
temp = (Stu*)malloc(sizeof(Stu));
p = L;
p = p->next;
int i, j;
for(i = 0; i < L->size; i++){
p = L->next;
for(j = 0; j < L->size - i - 1; j++){
if(p->s.marks < p->next->s.marks){
temp->s = p->s;
p->s = p->next->s;
p->next->s = temp->s;
}
p = p->next;
}
}
free(temp);
return L;
}
Stu* Change_Data(Stu* L)
{
int Lc;
Stu *p = L;
printf("please input number\n");
scanf("%d", &Lc);
while(Lc > 0){
p = p->next;
Lc--;
}
printf("please input new data\n");
p->s = input();
return L;
}
void* Num_Seek(Stu* L)
{
int Lc;
printf("please input number\n");
scanf("%d", &Lc);
while(L->s.num != Lc){
L = L->next;
}
printf("%d, %s, %lf\n", L->s.num, L->s.name, L->s.marks);
}
void Display(Stu *L)
{
printf("%d\n", L->size);
L = L->next;
while(L != NULL){
printf("%d, %s, %lf\n", L->s.num, L->s.name, L->s.marks);
L = L->next;
}
}
void Select(Stu *H)
{
int i = 1;
while(i != 0){
printf(" please input 0 - 8\n");
scanf("%d", &i);
switch(i){
case 1:
H = Create_End();
break;
case 2:
H = Create_Front();
break;
case 3:
H = Insert(H);
break;
case 4:
H = Delete(H);
break;
case 5:
H = Sort(H);
break;
case 6:
H = Change_Data(H);
break;
case 7:
Num_Seek(H);
break;
case 8:
Display(H);
break;
case 0:
break;
default:
printf("please input correct number\n");
}
}
}
void Menu()
{
}
int main()
{
Stu *H;
H = (Stu*)malloc(sizeof(Stu));
Select(H);
return 0;
}