链表

来源:互联网 发布:编译java的软件 编辑:程序博客网 时间:2024/06/11 13:56

结构体变量3种方法:
1.先声明类型,再声明变量
2.在声明类型的同时定义变量
3.在声明类型的同时定义变量(结构体名可以省略)
typedef 代替一个复杂的类型
结构体变量不能进行整体输入输出,必须去给结构体变量
中某个属性操作,但是相同的结构体变量可以互相赋值
typedef struct student
{
int number;
char name[20];
}STU;
STU a[10];
void sort(STU *a,int n)
{
int i,j;
STU t;
for(i = 0;i < n;i )
{
for(j = 0;j<n-i-1;j )
{
if(a[j].number < a[j 1].number)
{
t = a[j];
a[j] = a[j 1];
a[j 1] = t;
}
}
}
}
********************************************

单链表,双链表,循环链表
创建:静态链表,动态链表
NODE:数据区(当前结点本身值),地址区(下个结点地址)
此单链表都为不带头结点的单链表
1,单链表创建
typedef struct node
{
int n;
struct node *next;
}Node;
Node *create()
{
Node *head = NULL,*pnew =NULL,*ptail=NULL;
pnew = (Node*)malloc(sizeof(Node));
pnew->next = NULL;
while(1 == scanf("%d",&pnew->n))
{
if(head == NULL)
head = pnew;
else
ptail->next = pnew;
ptail = pnew;
pnew = (Node*)malloc(sizeof(Node));
pnew->next =NULL;
}
free(pnew);
pnew = NULL;
return head;
}
2,单链表输出
void print(Node *head)
{
Node *p = head;
while(p != NULL)
{
printf("%d ",p->n);
p = p->next;
}
printf("\n");
}
3,单链表排序
Node *sort(Node *head)
{
Node *newhead=NULL,*newtail=NULL,*p,*min,*minf;
if(head == NULL || head->next == NULL)
return head;
while(head != NULL)
{
p = min = head;
for(;p->next != NULL;p = p->next)
{
if(p->next->n < min->n)
{
min = p->next;
minf = p;
}
}
//2
if(newhead==NULL)
{
newhead = newtail = min;
}
else
{
newtail->next = min;
newtail = min;
}
//3
if(min == head)
head = head->next;
else
minf->next = min->next;
}
if(newhead != NULL)
newtail->next = NULL;
return newhead;
}
4,单链表倒序输出
Node *swap(Node *head)
{
Node *p = NULL,*pf = NULL,*pn = NULL;
if(head == NULL || head->next == NULL)
return head;
pf = head;
p = pf->next;
pf->next = NULL;
while(p->next != NULL)
{
pn = p->next;
p->next = pf;
pf = p;
p = pn;
}
p->next = pf;
head = p;
return head;
}
5,遍历一遍,并找到单链表中间的位置
void test(Node *head)
{
Node *p1,*p2;
p1 = p2 = head;
while(p1 != NULL)
{
p1 = p1->next;
if(p1!=NULL)
{
p1 = p1->next;
p2 = p2->next;
}
}
}
*******************
循环单链表的创建
typedef struct data
{
int n;
struct data *next;
struct data *front;
}Node;
Node *create()
{
Node *head=NULL,*p1=NULL,*p2=NULL;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
while(1 == scanf("%d",&p1->n))
{
if(head == NULL)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
}
free(p1);
p1 = NULL;
p2->next = head;
return head;
}
输出
void print(Node *head)
{
Node *p = head;
do
{
printf("%d ",p->n);
p = p->next;
}while(p != head);
printf("\n");
}
双向单链表的创建
Node *create()
{
Node *head=NULL,*p1=NULL,*p2=NULL;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
p1->front = NULL;
while(1 == scanf("%d",&p1->n))
{
if(head == NULL)
head = p1;
else
{
p2->next = p1;
p1->front = p2;
}
p2 = p1;
p1 = (Node*)malloc(sizeof(Node));
p1->next = NULL;
p1->front = NULL;
}
free(p1);
p1 = NULL;
return head;
}
输出
void print(Node *head)
{
Node *p = head,*p1 = NULL;
while(p != NULL)
{
p1= p;
printf("%d ",p->n);
p = p->next;
}
printf("\n");
while(p1 != NULL)
{
printf("%d ",p1->n);
p1 = p1->front;
}
printf("\n");
}

原创粉丝点击