循环链表及其操作:
就是将尾指针指向头部:
如:#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct data {
int num;
struct data *next;
}DaTa,*Data;
//创建循环链表
Data create(int n)
{
Data p, r=NULL, q=NULL ;
int i;
for ( i = 0; i < n; i++)
{
printf(“请输入第%d个值”,i+1);
p = (Data)malloc(sizeof(Data));
scanf("%d",&p->num);
p->next = r;
if (r == NULL)
{
r = p;
}
else
{
q->next = p;
}
q = p;
}
return r;
}
//遍历循环链表
void print(Data list)
{
Data r = list;
do {
printf("%d\t",r->num);
r = r->next;
} while (r != list);
}
void main() {
Data head;
head = create(5);
print(head);
system(“pause”);
}
双链表(双向链表)及其操作:
即有两个指针域,一个指向直接前驱,一个指向直接后继
Llink Data Rlink
双向链表可以是循环的,也可以是不循环的
双向链表有一个特性,即p为指向链表中每个节点的指针,则在表达式中,有
p->llink->rlink=p->rlink->llink=p;
双向链表的插入与删除算法:
1.在双向循环链表中第一个数据域内容为x的节点右边插入一个数据信息为item的新节点
int insertd(Data list, int x, int item)
{
Data p, q;
q = list->rlink;//带头节点的双向链表
while (q != list && q->num != x)//寻找第一个满足条件的节点
{
q = q->rlink;
}
if (q == list)
{
printf(“内有满足田间的节点”);
return -1;
}
p = (Data)malloc(sizeof(DaTa));//申请一个节点
p->num = item;
p->llink = q;
p->rlink = q->rlink;
q->rlink->llink = p;
q->rlink = p;
return 1;//插入成功返回1
}
2.从带有头节点的双向链表中删除第一个数据域内容为x的节点。
int delect(Data list,int x)
{
Data q;
q = list->rlink;
while (q != list && q->num != x)
{
q = q->rlink;
}
if (q == list)
{
printf(“没有满足添加的头节点”);
return -1;
}
q->llink->rlink = q->rlink;
q->rlink->llink = q->llink;
free§;
return 1;
}
链表应用:1.链式存储一元多项式相加(自行理解)
2.打印文本文件的最后n行:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define DEFLINES 10//n的值为10
#define MAXLEN 81//假设一行有80个字符
struct Tail {
char data[MAXLEN];
struct Tail *link;
};
void main(int argc,char *argv[])
{
int i;
char curline[MAXLEN], *filename;
int n = DEFLINES;
struct Tail *list, *ptr = NULL , *qtr=NULL;
FILE *fp;
if (argc == 3 && argv[1][0] == '-') {
n = atoi(argv[1]+1);
filename = argv[1];
}
else if (argc == 2)
{
filename = argv[1];
}
else {
fprintf(stderr,"Usage:tail [-n] filername\n");
exit(1);
}
if ((fp = fopen(filename, "r")) == NULL)
{
fprintf(stderr,"错误\n");
}
list = qtr = (struct Tail *)malloc(sizeof(struct Tail));
qtr->data[0] = '\0';
for ( i = 1; i < n; i++)
{
ptr= (struct Tail *)malloc(sizeof(struct Tail));
ptr->data[0] = '\0';
qtr->link = ptr;
}
ptr->link = list;
ptr = list;
while (fgets(curline, MAXLEN, fp) != NULL)
{
strcpy(ptr->data,curline);
ptr = ptr->link;
}
for ( i = 0; i < n; i++)
{
if (ptr->data[0] == '\0')
printf("%s",ptr->data);
ptr = ptr->link;
}
fclose(fp);
system("pause");
}